postgresql外部キー構文


122

以下のposgresqlコードでわかるように、2つのテーブルがあります。最初のテーブルの学生には2つの列があります。1つはStudent_nameで、もう1つは主キーであるStudent_idです。テストと呼ばれる2番目のテーブルには、4つの列があります。1つはsubject_id、1つはsubject_name、次に1つは、被験者の中で最も高いスコアが最も高い、Student_idの生徒用です。私の生徒のテーブルで、highestStudent_idがStudent_idを参照するようにしています これは私が以下に持っているコードです、構文が正しいかどうかわかりません:

CREATE TABLE students ( student_id SERIAL PRIMARY KEY,
                 player_name TEXT);

CREATE TABLE tests ( subject_id SERIAL,
                   subject_name,
                   highestStudent_id SERIAL REFERENCES students);

構文はhighestStudent_id SERIAL REFERENCES students正しいですか?私は別のようなものを見たのでhighestStudent_id REFERENCES students(student_id))

postgresqlで外部キーを作成する正しい方法は何ですか?


4
はい、構文は「正しい」です。ただし、FK列はとして定義する必要があるため、定義しないserialでくださいintegerserialこれは「実際の」データ型ではありません。これは、シーケンスからデフォルト値を入力するための省略形です
a_horse_with_no_name

FKが主キーを参照する場合、列は必要ありません。FKが代替キーを参照する場合、列が必要です。
jarlh

1
外部キーがテーブル「プレーヤー」を参照しています。あなたは表示されません持っている「選手」という名前のテーブルを。
マイクシェリル「キャットリコール」、

@Mike Sherrill 'Cat Recall申し訳ありませんが、私の間違いは、highestStudent_id integer REFERENCESの生徒を意味していました
Hamza

回答:


249

このテーブルを仮定すると:

CREATE TABLE students 
( 
  student_id SERIAL PRIMARY KEY,
  player_name TEXT
);

外部キーを定義する方法は4つあり(単一の列のPKを扱う場合)、それらはすべて同じ外部キー制約につながります。

  1. ターゲット列に言及しないインライン:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students
    );
  2. ターゲット列に言及することでインライン化:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students (student_id)
    );
  3. 内の行外create table

    CREATE TABLE tests 
    ( 
      subject_id SERIAL,
      subject_name text,
      highestStudent_id integer, 
      constraint fk_tests_students
         foreign key (highestStudent_id) 
         REFERENCES students (student_id)
    );
  4. 別のalter tableステートメントとして:

    CREATE TABLE tests 
    ( 
      subject_id SERIAL,
      subject_name text,
      highestStudent_id integer
    );
    
    alter table tests 
        add constraint fk_tests_students
        foreign key (highestStudent_id) 
        REFERENCES students (student_id);

あなたがどちらを好むかは好みの問題です。ただし、スクリプトは一貫している必要があります。最後の2つのステートメントは、複数の列で構成されるPKを参照する外部キーがある場合の唯一のオプションです。その場合、FKを「インライン」で定義することはできません。たとえば、foreign key (a,b) references foo (x,y)

システムがPostgresから生成したものを使いたくない場合は、バージョン3)と4)だけがFK制約に独自の名前を定義する機能を提供します。


serialデータ型は、実際のデータ型ではありません。シーケンスから取得した列のデフォルト値を定義するのは、単なる簡略表記です。任意の列に参照として定義された列は、serial適切な塩基のタイプを使用して定義されなければならないinteger(又はbigintためのbigserial列)


このリンク(postgresqltutorial.com/postgresql-foreign-key)は、3と4の 'constraint'コマンドでしか実行できないと言っていることを実行する別の方法を示しています。また、FKの前にFOREIGN KEYを置くとどうなりますか?それを行うと、変数の型を宣言する必要がないように見えますか?
wordsforthewise
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.