Uitgaande van deze tabel:
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
Er zijn vier verschillende manieren om een refererende sleutel te definiëren (wanneer je te maken hebt met een enkele kolom PK) en ze leiden allemaal tot dezelfde beperking van de refererende sleutel:
-
Inline zonder de doelkolom te vermelden:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
Inline met vermelding van de doelkolom:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
Buiten de lijn binnen de
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) );
-
Als een aparte
alter table
verklaring: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);
Welke je voorkeur heeft, is een kwestie van smaak. Maar je moet consistent zijn in je scripts. De laatste twee instructies zijn de enige optie als u externe sleutels hebt die verwijzen naar een PK die uit meer dan één kolom bestaat - u kunt in dat geval de FK niet "inline" definiëren, b.v. foreign key (a,b) references foo (x,y)
Alleen versie 3) en 4) geven je de mogelijkheid om je eigen naam te definiëren voor de FK-beperking als je de door het systeem gegenereerde van Postgres niet leuk vindt.
De serial
gegevenstype is niet echt een gegevenstype. Het is slechts een korte handnotatie die een standaardwaarde definieert voor de kolom uit een reeks. Dus elke kolom verwijzend een kolom gedefinieerd als serial
moet worden gedefinieerd met behulp van het juiste basistype integer
(of bigint
voor bigserial
kolommen)