Nunca he "codificado a mano" el código de creación de objetos para SQL Server y la declinación de la clave externa es aparentemente diferente entre SQL Server y Postgres. Aquí está mi sql hasta ahora:
drop table exams;
drop table question_bank;
drop table anwser_bank;
create table exams
(
exam_id uniqueidentifier primary key,
exam_name varchar(50),
);
create table question_bank
(
question_id uniqueidentifier primary key,
question_exam_id uniqueidentifier not null,
question_text varchar(1024) not null,
question_point_value decimal,
constraint question_exam_id foreign key references exams(exam_id)
);
create table anwser_bank
(
anwser_id uniqueidentifier primary key,
anwser_question_id uniqueidentifier,
anwser_text varchar(1024),
anwser_is_correct bit
);
Cuando ejecuto la consulta me sale este error:
Mensaje 8139, Nivel 16, Estado 0, Línea 9 El número de columnas de referencia en clave externa difiere del número de columnas referenciadas, tabla 'question_bank'.
¿Puedes detectar el error?
sql
sql-server
tsql
mmattax
fuente
fuente
Respuestas:
fuente
Y si solo desea crear la restricción por sí solo, puede usar ALTER TABLE
No recomendaría la sintaxis mencionada por Sara Chipps para la creación en línea, solo porque prefiero nombrar mis propias restricciones.
fuente
También puede nombrar su restricción de clave externa utilizando:
fuente
Me gusta la respuesta de AlexCuse, pero algo a lo que debe prestar atención cada vez que agrega una restricción de clave externa es cómo desea que se traten las actualizaciones de la columna referenciada en una fila de la tabla referenciada, y especialmente cómo desea eliminar las filas en la referencia mesa a tratar.
Si se crea una restricción como esta:
.. luego las actualizaciones o eliminaciones en la tabla referenciada explotarán con un error si hay una fila correspondiente en la tabla de referencia.
Ese podría ser el comportamiento que desea, pero en mi experiencia, mucho más comúnmente no lo es.
Si en cambio lo creas así:
.. luego las actualizaciones y eliminaciones en la tabla principal darán lugar a actualizaciones y eliminaciones de las filas correspondientes en la tabla de referencia.
(No estoy sugiriendo que se cambie el valor predeterminado, el error por defecto es cauteloso, lo cual es bueno. Solo digo que es algo a lo que una persona que crea constaints siempre debe prestar atención ).
Esto se puede hacer, por cierto, al crear una tabla, así:
fuente
- Eso también funcionará. ¿Quizás una construcción un poco más intuitiva?
fuente
Para crear una clave foránea en cualquier tabla
fuente
Si desea crear dos columnas de tabla en una relación mediante una consulta, intente lo siguiente:
fuente
Como usted, generalmente no creo claves foráneas a mano, pero si por alguna razón necesito el script para hacerlo, generalmente lo creo usando ms sql server management studio y antes de guardar los cambios, selecciono Table Designer | Generar secuencia de comandos de cambio
fuente
Este script trata sobre la creación de tablas con clave externa y agregué la restricción de integridad referencial sql-server .
fuente
Nigromancia
En realidad, hacer esto correctamente es un poco más complicado.
Primero debe verificar si la clave principal existe para la columna a la que desea establecer su clave externa para hacer referencia.
En este ejemplo, se crea una clave externa en la tabla T_ZO_SYS_Language_Forms, que hace referencia a dbo.T_SYS_Language_Forms.LANG_UID
fuente
Siempre uso esta sintaxis para crear la restricción de clave externa entre 2 tablas
es decir
fuente