web-dev-qa-db-fra.com

syntaxe de clé étrangère postgresql

J'ai 2 tables comme vous le verrez dans mon code posgresql ci-dessous. La première table student a 2 colonnes, une pour student_name et l'autre student_id qui est la clé primaire. Dans ma deuxième table appelée tests, elle contient 4 colonnes, une pour subject_id, une pour subject_name, puis une pour un élève ayant le score le plus élevé dans une matière qui est le plus élevéStudent_id. J'essaie de faire que mostStudent_id se réfère à student_id dans la table my students. Ceci est le code que j'ai ci-dessous, je ne suis pas sûr si la syntaxe est correcte:

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

CREATE TABLE tests ( subject_id SERIAL,
                   subject_name,
                   highestStudent_id SERIAL REFERENCES students);

la syntaxe highestStudent_id SERIAL REFERENCES students est-elle correcte? parce que j'en ai vu un autre comme highestStudent_id REFERENCES students(student_id))

Quelle serait la bonne façon de créer la clé étrangère dans postgresql s'il vous plaît?

105
Hamza

En supposant que cette table:

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 clé PK à une seule colonne) et toutes conduisent à 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 mention de la colonne cible:

    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students (student_id)
    );
    
  3. Hors ligne à l'intérieur du 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 qu'instruction alter table distincte:

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

Lequel vous préférez est une question de goût. Mais vous devriez ê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 une PK composée de plusieurs colonnes - vous ne pouvez pas définir le FK "en ligne" dans ce cas, par exemple. 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 les contraintes générées par le système à partir de Postgres.


Le type de données serial 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 extraite d'une séquence. Ainsi, toute colonne référencement une colonne définie comme serial doit être définie à l'aide du type de base approprié integer (ou bigint pour bigserial colonnes)

200
a_horse_with_no_name