Frage 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 verweisen. 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 richtig? weil ich einen anderen wie gesehen habe highestStudent_id REFERENCES students(student_id))

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


76
2018-02-17 09:44


Ursprung


Antworten:


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. 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)
    );
    
  4. Als ein separates alter table Erklärung:

    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 Fremdschlüssel eine PK referenzieren, die aus mehr als einer Spalte besteht - Sie können den FK in diesem Fall nicht "inline" definieren, z. foreign key (a,b) references foo (x,y) 

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


Das serial Datentyp ist nicht wirklich ein Datentyp. Es ist nur eine kurze Handnotation, die einen Standardwert für die Spalte aus einer Sequenz definiert. Also jede Spalte Referenzieren eine Spalte definiert als serial muss mit dem entsprechenden Basistyp definiert werden integer (oder bigint zum bigserial Säulen)


148
2018-02-17 11:10