Tengo 2 tablas como verá en mi código posgresql a continuación. La primera tabla estudiantes tiene 2 columnas, una para nombre_estudiante y la otra id_estudiante, que es la clave principal. En mi segunda tabla llamada tests, tiene 4 columnas, una para subject_id, una para subject_name, luego otra para un estudiante con la puntuación más alta en una materia que es la más alta Student_id. Estoy tratando de hacer que más altoStudent_id se refiera a student_id en mi tabla de estudiantes. Este es el código que tengo a continuación, no estoy seguro de si la sintaxis es correcta:
CREATE TABLE students ( student_id SERIAL PRIMARY KEY,
player_name TEXT);
CREATE TABLE tests ( subject_id SERIAL,
subject_name,
highestStudent_id SERIAL REFERENCES students);
¿es highestStudent_id SERIAL REFERENCES students
correcta la sintaxis ? porque he visto otro comohighestStudent_id REFERENCES students(student_id))
¿Cuál sería la forma correcta de crear la clave externa en postgresql, por favor?
serial
debería definirse comointeger
.serial
no es un tipo de datos "real", es una forma abreviada deRespuestas:
Asumiendo esta tabla:
Hay cuatro formas diferentes de definir una clave externa (cuando se trata de un PK de una sola columna) y todas conducen a la misma restricción de clave externa:
Inline sin mencionar la columna de destino:
En línea con la mención de la columna de destino:
Fuera de línea dentro de
create table
:Como
alter table
declaración separada :Cuál prefieres es cuestión de gustos. Pero debes ser coherente con tus guiones. Las dos últimas 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, por ejemplo
foreign key (a,b) references foo (x,y)
Solo la versión 3) y 4) le dará la capacidad de definir su propio nombre para la restricción FK si no le gustan los generados 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. Por lo tanto, cualquier columna que haga referencia a una columna definida comoserial
debe definirse utilizando el tipo de base apropiadointeger
(obigint
parabigserial
columnas)fuente