Angenommen diese Tabelle:
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
Es gibt vier verschiedene Möglichkeiten, einen Fremdschlüssel zu definieren (wenn es sich um eine einzelne Spalte PK handelt), und alle führen zu derselben Fremdschlüsseleinschränkung:
-
Inline ohne Angabe der Zielspalte:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
Inline mit Erwähnung der Zielspalte:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
Außerhalb der Linie innerhalb der
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 separate
alter table
Aussage: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);
Welche man bevorzugt, ist Geschmackssache. Aber Sie sollten in Ihren Skripten konsistent sein. Die letzten beiden Anweisungen sind die einzige Option, wenn Sie Fremdschlüssel haben, die auf einen PK verweisen, der aus mehr als einer Spalte besteht. In diesem Fall können Sie den FK nicht "inline" definieren, z. foreign key (a,b) references foo (x,y)
Nur Version 3) und 4) geben Ihnen die Möglichkeit, Ihren eigenen Namen für die FK-Einschränkung zu definieren, wenn Sie die vom System generierten von Postgres nicht mögen.
Die serial
Datentyp ist nicht wirklich ein Datentyp. Es ist nur eine Kurzschreibweise, die einen Standardwert für die Spalte aus einer Sequenz definiert. Also jede Spalte referenziert eine als serial
definierte Spalte muss mit dem entsprechenden Basistyp integer
definiert werden (oder bigint
für bigserial
Spalten)