sql >> Databasteknik >  >> RDS >> PostgreSQL

postgresql syntax för främmande nyckel

Om vi ​​antar denna tabell:

CREATE TABLE students 
( 
  student_id SERIAL PRIMARY KEY,
  player_name TEXT
);

Det finns fyra olika sätt att definiera en främmande nyckel (när man hanterar en enstaka kolumn PK) och de leder alla till samma främmande nyckelrestriktion:

  1. Inline utan att nämna målkolumnen:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students
    );
    
  2. Inline med att nämna målkolumnen:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students (student_id)
    );
    
  3. Utan linjen i 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. Som en separat alter table uttalande:

    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);
    

Vilken du föredrar är en smaksak. Men du bör vara konsekvent i dina manus. De två sista satserna är det enda alternativet om du har främmande nycklar som refererar till en PK som består av mer än en kolumn - du kan inte definiera FK "inline" i så fall, t.ex. foreign key (a,b) references foo (x,y)

Endast version 3) och 4) ger dig möjlighet att definiera ditt eget namn för FK-begränsningen om du inte gillar de systemgenererade från Postgres.

serial datatyp är egentligen inte en datatyp. Det är bara en kort handnotation som definierar ett standardvärde för kolumnen från en sekvens. Så vilken kolumn som helst som refererar en kolumn definierad som serial måste definieras med lämplig bastyp integer (eller bigint för bigserial kolumner)




  1. Skaffa ett föräldrar + barnträd med pg-löfte

  2. VMware CPU Hot Plug vNUMA Effekter på SQL Server

  3. 6 sätt att välja dubbletter av rader i Oracle

  4. En guide till Pgpool för PostgreSQL:Del ett