Forudsat denne tabel:
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
Der er fire forskellige måder at definere en fremmednøgle på (når man har at gøre med en enkelt kolonne PK), og de fører alle til den samme fremmednøglebegrænsning:
-
Inline uden at nævne målkolonnen:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
Inline med omtale af målkolonnen:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
Ude af linjen inde i
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) );
-
Som en separat
alter table
erklæring: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);
Hvilken man foretrækker er en smagssag. Men du bør være konsekvent i dine scripts. De sidste to udsagn er den eneste mulighed, hvis du har fremmednøgler, der refererer til en PK, der består af mere end én kolonne - du kan i så fald ikke definere FK'en "inline", f.eks. foreign key (a,b) references foo (x,y)
Kun version 3) og 4) vil give dig mulighed for at definere dit eget navn til FK-begrænsningen, hvis du ikke kan lide de systemgenererede fra Postgres.
serial
datatype er ikke rigtig en datatype. Det er kun en kort håndnotation, der definerer en standardværdi for kolonnen taget fra en sekvens. Så enhver kolonne henvisning en kolonne defineret som serial
skal defineres ved hjælp af den relevante basistype integer
(eller bigint
for bigserial
kolonner)