En supposant ce tableau :
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
Il existe quatre manières différentes de définir une clé étrangère (lorsqu'il s'agit d'une seule colonne PK) et elles conduisent toutes à la même contrainte de clé étrangère :
-
Inline sans mentionner la colonne cible :
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
En ligne avec la mention de la colonne cible :
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
Hors ligne dans le
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) );
-
En tant que
alter table
séparé déclaration :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);
Celui que vous préférez est une question de goût. Mais vous devez être cohérent dans vos scripts. Les deux dernières instructions sont la seule option si vous avez des clés étrangères référençant un PK qui se compose de plus d'une colonne - vous ne pouvez pas définir le FK "en ligne" dans ce cas, par ex. foreign key (a,b) references foo (x,y)
Seules les versions 3) et 4) vous donneront la possibilité de définir votre propre nom pour la contrainte FK si vous n'aimez pas ceux générés par le système à partir de Postgres.
Le serial
le type de données n'est pas vraiment un type de données. C'est juste une notation abrégée qui définit une valeur par défaut pour la colonne tirée d'une séquence. Ainsi, toute colonne référençant une colonne définie comme serial
doit être défini en utilisant le type de base approprié integer
(ou bigint
pour bigserial
colonnes)