Ако приемем тази таблица:
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_id) 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_id) REFERENCES students (student_id);
Кой предпочитате е въпрос на вкус. Но трябва да сте последователни в своите скриптове. Последните две изрази са единствената опция, ако имате външни ключове, препращащи към PK, който се състои от повече от една колона - не можете да дефинирате FK "inline" в този случай, напр. foreign key (a,b) references foo (x,y)
Само версии 3) и 4) ще ви дадат възможност да дефинирате собствено име за FK ограничението, ако не харесвате генерираните от системата такива от Postgres.
serial
типът данни всъщност не е тип данни. Това е просто кратка нотация на ръка, която дефинира стойност по подразбиране за колоната, взета от последователност. Така че всяка колона препраща колона, дефинирана като serial
трябва да се дефинира с помощта на подходящия основен тип integer
(или bigint
за bigserial
колони)