Om vi antar denna tabell:
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
Det finns fyra olika sätt att definiera en främmande nyckel (när man hanterar en enstaka kolumn PK) och de leder alla till samma främmande nyckelrestriktion:
-
Inline utan att nämna målkolumnen:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
Inline med att nämna målkolumnen:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
Utan linjen 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
uttalande: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);
Vilken du föredrar är en smaksak. Men du bör vara konsekvent i dina manus. De två sista satserna är det enda alternativet om du har främmande nycklar som refererar till en PK som består av mer än en kolumn - du kan inte definiera FK "inline" i så fall, t.ex. foreign key (a,b) references foo (x,y)
Endast version 3) och 4) ger dig möjlighet att definiera ditt eget namn för FK-begränsningen om du inte gillar de systemgenererade från Postgres.
serial
datatyp är egentligen inte en datatyp. Det är bara en kort handnotation som definierar ett standardvärde för kolumnen från en sekvens. Så vilken kolumn som helst som refererar en kolumn definierad som serial
måste definieras med lämplig bastyp integer
(eller bigint
för bigserial
kolumner)