Ответ 1
Предполагая эту таблицу:
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
Существует четыре разных способа определения внешнего ключа (при работе с одним столбцом PK), и все они приводят к одному и тому же ограничению внешнего ключа:
-
Строка без упоминания целевого столбца:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
В строке с указанием целевого столбца:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
Вне строки внутри
create table
:CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer, constraint fk_tests_students foreign key (highestStudent) REFERENCES students (student_id) );
-
В качестве отдельного оператора
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) REFERENCES students (student_id);
Какой из них вы предпочитаете, это вопрос вкуса. Но вы должны быть последовательны в своих сценариях. Последние два утверждения являются единственной опцией, если у вас есть внешние ключи, ссылающиеся на PK, который состоит из более чем одного столбца - вы не можете определить FK "inline" в этом случае, например. foreign key (a,b) references foo (x,y)
Только версии 3) и 4) даст вам возможность определить собственное имя для ограничения FK, если вам не нравятся созданные системой из Postgres.
Тип данных serial
не является типом данных. Это всего лишь короткая нотация, определяющая значение по умолчанию для столбца, взятого из последовательности. Поэтому любой столбец, ссылающийся на столбец, определяемый как serial
, должен быть определен с использованием соответствующего базового типа integer
(или bigint
для столбцов bigserial
)