1. ホーム
  2. sql

[解決済み] Postgresql の外部キーの構文

2022-03-05 16:23:53

質問

以下のposgresqlのコードにあるように、私は2つのテーブルを持っています。最初のテーブルstudentsには2つのカラムがあり、1つはstudent_nameで、もう1つは主キーであるstudent_idです。 2つ目のテーブルtestsには4つのカラムがあり、1つはsubject_id、1つはsubject_name、そして1つはhighestStudent_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で外部キーを作成する正しい方法は何でしょうか?

どのように解決するのですか?

このテーブルを想定しています。

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

外部キーを定義する方法は4種類あり(1列の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を "inline"で定義できません。 foreign key (a,b) references foo (x,y)

バージョン3)と4)のみ、Postgresのシステムで生成された名前が気に入らない場合、FK制約に独自の名前を定義することができます。


その serial のデータ型は、実際にはデータ型ではありません。これは、シーケンスから取り出したカラムのデフォルト値を定義する短い手の記法に過ぎない。したがって、任意のカラム 参照 として定義された列は serial は、適切な基本型を使って定義する必要があります。 integer (または bigint に対して bigserial カラム)