Ich habe 2 Tabellen, wie Sie in meinem posgresql-Code unten sehen werden. Die erste Tabelle Schüler hat 2 Spalten, eine für student_name und die andere student_id, die der Primärschlüssel ist. In meiner zweiten Tabelle mit dem Namen tests enthält diese 4 Spalten, eine für subject_id, eine für subject_name und eine für einen Schüler mit der höchsten Punktzahl in einem Fach, das die höchste Student_id ist. Ich versuche, die höchsteStudent_id in meiner Schülertabelle auf student_id zu verweisen. Dies ist der Code, den ich unten habe. Ich bin mir 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 noch einen gesehen habehighestStudent_id REFERENCES students(student_id))
Was wäre der richtige Weg, um den Fremdschlüssel in postgresql zu erstellen?
serial
sie definiert sein sollte alsinteger
.serial
ist kein "echter" Datentyp, sondern eine kurze Hand zumAntworten:
Angenommen, diese Tabelle:
Es gibt vier verschiedene Möglichkeiten, einen Fremdschlüssel zu definieren (wenn es sich um eine einzelne Spalten-PK handelt), und alle führen zu derselben Fremdschlüsseleinschränkung:
Inline ohne Erwähnung der Zielspalte:
In Übereinstimmung mit der Erwähnung der Zielspalte:
Außerhalb der Linie innerhalb der
create table
:Als separate
alter table
Aussage:Welches Sie bevorzugen, ist Geschmackssache. Sie sollten jedoch in Ihren Skripten konsistent sein. Die letzten beiden Anweisungen sind die einzige Option, wenn Sie Fremdschlüssel haben, die auf eine PK verweisen, die aus mehr als einer Spalte besteht. In diesem Fall können Sie die FK "inline" nicht 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 Namen von Postgres nicht mögen.
Der
serial
Datentyp ist eigentlich kein Datentyp. Es ist nur eine kurze Notation, die einen Standardwert für die Spalte aus einer Sequenz definiert. Daher muss jede Spalte, die auf eine alsserial
definierte Spalte verweist , unter Verwendung des entsprechenden Basistypsinteger
(oderbigint
fürbigserial
Spalten) definiert werden.quelle