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:
-
Inline sem mencionar a coluna de destino:
TestesCREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
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) );
-
Fora de linha dentro dacreate table
:
TestesCREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer, constraint fk_tests_students foreign key (highestStudent_id) REFERENCES students (student_id) );
-
Como umaalter 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)