PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

syntaxe de clé étrangère postgresql

En supposant ce tableau :

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

Il existe quatre manières différentes de définir une clé étrangère (lorsqu'il s'agit d'une seule colonne PK) et elles conduisent toutes à la même contrainte de clé étrangère :

  1. Inline sans mentionner la colonne cible :

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students
    );
    
  2. En ligne avec la mention de la colonne cible :

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students (student_id)
    );
    
  3. Hors ligne dans le 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. En tant que alter table séparé déclaration :

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

Celui que vous préférez est une question de goût. Mais vous devez être cohérent dans vos scripts. Les deux dernières instructions sont la seule option si vous avez des clés étrangères référençant un PK qui se compose de plus d'une colonne - vous ne pouvez pas définir le FK "en ligne" dans ce cas, par ex. foreign key (a,b) references foo (x,y)

Seules les versions 3) et 4) vous donneront la possibilité de définir votre propre nom pour la contrainte FK si vous n'aimez pas ceux générés par le système à partir de Postgres.

Le serial le type de données n'est pas vraiment un type de données. C'est juste une notation abrégée qui définit une valeur par défaut pour la colonne tirée d'une séquence. Ainsi, toute colonne référençant une colonne définie comme serial doit être défini en utilisant le type de base approprié integer (ou bigint pour bigserial colonnes)