Zakładając tę tabelę:
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
Istnieją cztery różne sposoby definiowania klucza obcego (w przypadku pojedynczej kolumny PK) i wszystkie prowadzą do tego samego ograniczenia klucza obcego:
-
W tekście bez wzmianki o kolumnie docelowej:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
W zgodzie ze wzmianką o kolumnie docelowej:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
Poza linią wewnątrz
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 oddzielna
alter table
oświadczenie: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);
To, który wolisz, to kwestia gustu. Ale powinieneś być konsekwentny w swoich skryptach. Dwie ostatnie instrukcje są jedyną opcją, jeśli masz klucze obce odwołujące się do PK składającego się z więcej niż jednej kolumny - w takim przypadku nie możesz zdefiniować FK "inline", np. foreign key (a,b) references foo (x,y)
Tylko wersje 3) i 4) dają możliwość zdefiniowania własnej nazwy dla ograniczenia FK, jeśli nie podobają Ci się te wygenerowane przez system z Postgresa.
serial
typ danych tak naprawdę nie jest typem danych. To tylko krótka notacja ręczna, która definiuje domyślną wartość kolumny wziętej z sekwencji. Tak więc każda kolumna odwołująca się kolumna zdefiniowana jako serial
musi być zdefiniowany przy użyciu odpowiedniego typu bazowego integer
(lub bigint
dla bigserial
kolumny)