webentwicklung-frage-antwort-db.com.de

postgresql-Fremdschlüsselsyntax

Ich habe 2 Tabellen, wie Sie in meinem posgresql Code unten sehen werden. Die erste Tabelle students enthält 2 Spalten, eine für student_name und die andere student_id, die den Primärschlüssel darstellt. In meiner zweiten Tabelle mit dem Namen "tests" enthält diese Tabelle 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 mit der höchsten "student_id". Ich versuche, dass highestStudent_id auf student_id in meiner Schülertabelle verweist. 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 der richtige Weg, um den Fremdschlüssel in postgresql zu erstellen?

105
Hamza

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

  1. Inline ohne Angabe 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. Außerhalb der Zeile in 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)
    );
    
  4. Als separate alter table Anweisung:

    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 Sie bevorzugen, 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 "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 von Postgres generierten nicht mögen.


Der Datentyp serial ist eigentlich kein Datentyp. Es ist nur eine Kurznotation, die einen Standardwert für die aus einer Sequenz entnommene Spalte definiert. Jede Spalte referenzierend eine als serial definierte Spalte muss mit dem entsprechenden Basistyp integer (oder bigint für bigserial definiert werden Säulen)

200