postgresql Fremdschlüsselsyntax

Ich habe 2 Tabellen, wie Sie in meinem postgresql Code unten sehen werden. Die ersten Tabellenschüler haben 2 Spalten, eine für student_name und die andere student_id für den Primärschlüssel. In meiner zweiten Tabelle namens tests gibt es 4 Spalten, eine für subject_id, eine für den subject_name, dann eine für einen Studenten mit der höchsten Punktzahl in einem Fach, das die höchste student_id ist. Ich versuche, highestStudent_id auf student_id in meiner Schüler-Tabelle zu beziehen. Dies ist der Code, den ich unten habe, bin nicht sicher, ob die Syntax korrekt ist:

CREATE TABLE students ( student_id SERIAL PRIMARY KEY, player_name TEXT); CREATE TABLE tests ( subject_id SERIAL, subject_name, highestStudent_id SERIAL REFERENCES students); 

ist die Syntax highestStudent_id SERIAL REFERENCES students korrekt? weil ich einen anderen gesehen habe wie highestStudent_id REFERENCES students(student_id))

Was wäre die korrekte Art den Fremdschlüssel in postgresql zu erstellen?

Solutions Collecting From Web of "postgresql Fremdschlüsselsyntax"

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 um eine einzelne Spalten-PK geht), und alle führen zu derselben Fremdschlüsseleinschränkung:

  1. Inline ohne Erwähnung der Zielspalte:

     CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students ); 
  2. Inline mit Erwähnung der Zielspalte:

     CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) ); 
  3. Out-of-Line in der create table :

     CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer, constraint fk_tests_students foreign key (highestStudent) REFERENCES students (student_id) ); 
  4. Als separate alter table statement:

     CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer ); alter table tests add constraint fk_tests_students foreign key (highestStudent) REFERENCES students (student_id); 

Welche Sie bevorzugen, ist Geschmackssache. Aber Sie sollten in Ihren Skripten konsistent sein. Die letzten beiden statementen sind die einzige Option, wenn Fremdschlüssel eine PK referenzieren, die aus mehr als einer Spalte besteht. In diesem Fall können Sie den FK nicht "inline" definieren, z. B. foreign key (a,b) references foo (x,y)

Nur Version 3) und 4) gibt Ihnen die Möglichkeit, Ihren eigenen Namen für die FK-Einschränkung zu definieren, wenn Sie die systemgenerierten aus Postgres nicht mögen.


Der serial datatyp ist nicht wirklich ein datatyp. Es ist nur eine kurze Handnotation, die einen Standardwert für die Spalte aus einer Sequenz definiert. Daher muss jede Spalte, die auf eine als serial definierte Spalte verweist , mit dem entsprechenden Basistyp integer (oder bigint für bigserial Spalten) definiert werden.