PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

sintaxe de chave estrangeira postgresql


Supondo esta tabela:
CREATE TABLE students 
( 
  student_id SERIAL PRIMARY KEY,
  player_name TEXT
);

Existem quatro maneiras diferentes de definir uma chave estrangeira (ao lidar com uma única coluna PK) e todas elas levam à mesma restrição de chave estrangeira:

  1. Inline sem mencionar a coluna de destino:
    Testes
    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students
    );
    

  2. Em linha com a menção da coluna de destino:
    CREATE TABLE tests 
    ( 
       subject_id SERIAL,
       subject_name text,
       highestStudent_id integer REFERENCES students (student_id)
    );
    

  3. Fora de linha dentro da create table :
    Testes
    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. Como uma alter table separada demonstração:
    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);
    

Qual você prefere é uma questão de gosto. Mas você deve ser consistente em seus scripts. As duas últimas instruções são a única opção se você tiver chaves estrangeiras referenciando um PK que consiste em mais de uma coluna - você não pode definir o FK "inline" nesse caso, por exemplo, foreign key (a,b) references foo (x,y)

Apenas a versão 3) e 4) lhe dará a capacidade de definir seu próprio nome para a restrição FK se você não gostar das geradas pelo sistema do Postgres.

A serial tipo de dados não é realmente um tipo de dados. É apenas uma notação de mão curta que define um valor padrão para a coluna retirada de uma sequência. Portanto, qualquer coluna referenciando uma coluna definida como serial deve ser definido usando o tipo de base apropriado integer (ou bigint para bigserial colunas)