PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

sintassi della chiave esterna postgresql

Supponendo questa tabella:

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

Esistono quattro modi diversi per definire una chiave esterna (quando si ha a che fare con una singola colonna PK) e portano tutti allo stesso vincolo di chiave esterna:

  1. Inline senza menzionare la colonna target:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students
    );
    
  2. In linea con la citazione della colonna target:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students (student_id)
    );
    
  3. Fuori riga all'interno di 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. Come una alter table separata dichiarazione:

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

Quale preferisci è una questione di gusti. Ma dovresti essere coerente nei tuoi script. Le ultime due istruzioni sono l'unica opzione se si dispone di chiavi esterne che fanno riferimento a una PK composta da più di una colonna:in tal caso non è possibile definire l'FK "inline", ad es. foreign key (a,b) references foo (x,y)

Solo le versioni 3) e 4) ti daranno la possibilità di definire il tuo nome per il vincolo FK se non ti piacciono quelli generati dal sistema da Postgres.

Il serial il tipo di dati non è realmente un tipo di dati. È solo una breve notazione a mano che definisce un valore predefinito per la colonna presa da una sequenza. Quindi qualsiasi colonna riferita una colonna definita come serial deve essere definito utilizzando il tipo di base appropriato integer (o bigint per bigserial colonne)