PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

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 sich um eine einzelne Spalte 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 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 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)