Asumiendo esta tabla:
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
Hay cuatro formas diferentes de definir una clave externa (cuando se trata de una PK de una sola columna) y todas conducen a la misma restricción de clave externa:
-
En línea sin mencionar la columna de destino:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
En línea con mencionar la columna de destino:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
Fuera de línea dentro de
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) );
-
Como una
alter table
separada declaración: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);
Cuál prefieres es cuestión de gustos. Pero debe ser consistente en sus guiones. Las últimas dos declaraciones son la única opción si tiene claves externas que hacen referencia a un PK que consta de más de una columna; no puede definir el FK "en línea" en ese caso, p. foreign key (a,b) references foo (x,y)
Solo las versiones 3) y 4) le permitirán definir su propio nombre para la restricción FK si no le gustan las generadas por el sistema desde Postgres.
El serial
tipo de datos no es realmente un tipo de datos. Es solo una notación abreviada que define un valor predeterminado para la columna tomada de una secuencia. Así que cualquier columna haciendo referencia una columna definida como serial
debe definirse usando el tipo base apropiado integer
(o bigint
para bigserial
columnas)