Za předpokladu této tabulky:
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
Existují čtyři různé způsoby, jak definovat cizí klíč (při práci s jedním sloupcem PK) a všechny vedou ke stejnému omezení cizího klíče:
-
Inline bez uvedení cílového sloupce:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
V souladu s uvedením cílového sloupce:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
Mimo řádek uvnitř
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) );
-
Jako samostatná
alter table
prohlášení: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);
Kterému dáváte přednost, je věcí vkusu. Ale měli byste být ve svých skriptech konzistentní. Poslední dva příkazy jsou jedinou možností, pokud máte cizí klíče odkazující na PK, která se skládá z více než jednoho sloupce - v takovém případě nelze definovat FK "inline", např. foreign key (a,b) references foo (x,y)
Pouze verze 3) a 4) vám dá možnost definovat vlastní název pro omezení FK, pokud se vám nelíbí ty systémem generované z Postgresu.
serial
datový typ není ve skutečnosti datovým typem. Je to jen krátký zápis, který definuje výchozí hodnotu pro sloupec převzatý ze sekvence. Tedy jakýkoli sloupec odkazující sloupec definovaný jako serial
musí být definován pomocí příslušného základního typu integer
(nebo bigint
pro bigserial
sloupce)