tabla - foreign key sql server ejemplo
¿Cómo creo una clave externa en SQL Server? (10)
Al igual que usted, normalmente no creo claves externas a mano, pero si por alguna razón necesito el script para hacerlo, generalmente lo creo utilizando el estudio de administración del servidor ms sql y antes de guardar y luego los cambios, selecciono el Diseñador de tablas | Generar script de cambio
Nunca he creado un código de creación de objetos "codificado a mano" para SQL Server y la eliminación de claves externas 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:
Msg 8139, Nivel 16, Estado 0, Línea 9 El número de columnas de referencia en clave externa difiere del número de columnas de referencia, tabla ''question_bank''.
¿Puedes detectar el error?
Este script trata sobre la creación de tablas con clave externa y agregué la restricción de integridad referencial sql-server .
create table exams
(
exam_id int primary key,
exam_name varchar(50),
);
create table question_bank
(
question_id int primary key,
question_exam_id int not null,
question_text varchar(1024) not null,
question_point_value decimal,
constraint question_exam_id_fk
foreign key references exams(exam_id)
ON DELETE CASCADE
);
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 a la columna de referencia en una fila de la tabla de referencia, y especialmente cómo desea eliminar las filas en la referencia Mesa a tratar.
Si una restricción se crea así:
alter table MyTable
add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn )
references MyOtherTable(PKColumn)
... luego las actualizaciones o eliminaciones en la tabla a la que se hace referencia 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, es mucho más común que no lo sea.
Si en cambio lo creas así:
alter table MyTable
add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn )
references MyOtherTable(PKColumn)
on update cascade
on delete cascade
..then las actualizaciones y eliminaciones en la tabla principal darán como resultado actualizaciones y eliminaciones de las filas correspondientes en la tabla de referencia.
(No estoy sugiriendo que se debe cambiar el valor predeterminado, el error se comporta con cautela, lo cual es bueno. Solo digo que es algo a lo que una persona que está creando constantes siempre debe prestar atención ).
Esto se puede hacer, por cierto, al crear una tabla, como esta:
create table ProductCategories (
Id int identity primary key,
ProductId int references Products(Id)
on update cascade on delete cascade
CategoryId int references Categories(Id)
on update cascade on delete cascade
)
Nigromancia.
En realidad, hacer esto correctamente es un poco más complicado.
Primero debe verificar si existe la clave principal para la columna a la que desea establecer su clave externa como referencia.
En este ejemplo, se crea una clave foránea en la tabla T_ZO_SYS_Language_Forms, que hace referencia a dbo.T_SYS_Language_Forms.LANG_UID
-- First, chech if the table exists...
IF 0 < (
SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = ''BASE TABLE''
AND TABLE_SCHEMA = ''dbo''
AND TABLE_NAME = ''T_SYS_Language_Forms''
)
BEGIN
-- Check for NULL values in the primary-key column
IF 0 = (SELECT COUNT(*) FROM T_SYS_Language_Forms WHERE LANG_UID IS NULL)
BEGIN
ALTER TABLE T_SYS_Language_Forms ALTER COLUMN LANG_UID uniqueidentifier NOT NULL
-- No, don''t drop, FK references might already exist...
-- Drop PK if exists
-- ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT pk_constraint_name
--DECLARE @pkDropCommand nvarchar(1000)
--SET @pkDropCommand = N''ALTER TABLE T_SYS_Language_Forms DROP CONSTRAINT '' + QUOTENAME((SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
--WHERE CONSTRAINT_TYPE = ''PRIMARY KEY''
--AND TABLE_SCHEMA = ''dbo''
--AND TABLE_NAME = ''T_SYS_Language_Forms''
----AND CONSTRAINT_NAME = ''PK_T_SYS_Language_Forms''
--))
---- PRINT @pkDropCommand
--EXECUTE(@pkDropCommand)
-- Instead do
-- EXEC sp_rename ''dbo.T_SYS_Language_Forms.PK_T_SYS_Language_Forms1234565'', ''PK_T_SYS_Language_Forms'';
-- Check if they keys are unique (it is very possible they might not be)
IF 1 >= (SELECT TOP 1 COUNT(*) AS cnt FROM T_SYS_Language_Forms GROUP BY LANG_UID ORDER BY cnt DESC)
BEGIN
-- If no Primary key for this table
IF 0 =
(
SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
WHERE CONSTRAINT_TYPE = ''PRIMARY KEY''
AND TABLE_SCHEMA = ''dbo''
AND TABLE_NAME = ''T_SYS_Language_Forms''
-- AND CONSTRAINT_NAME = ''PK_T_SYS_Language_Forms''
)
ALTER TABLE T_SYS_Language_Forms ADD CONSTRAINT PK_T_SYS_Language_Forms PRIMARY KEY CLUSTERED (LANG_UID ASC)
;
-- Adding foreign key
IF 0 = (SELECT COUNT(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS WHERE CONSTRAINT_NAME = ''FK_T_ZO_SYS_Language_Forms_T_SYS_Language_Forms'')
ALTER TABLE T_ZO_SYS_Language_Forms WITH NOCHECK ADD CONSTRAINT FK_T_ZO_SYS_Language_Forms_T_SYS_Language_Forms FOREIGN KEY(ZOLANG_LANG_UID) REFERENCES T_SYS_Language_Forms(LANG_UID);
END -- End uniqueness check
ELSE
PRINT ''FSCK, this column has duplicate keys, and can thus not be changed to primary key...''
END -- End NULL check
ELSE
PRINT ''FSCK, need to figure out how to update NULL value(s)...''
END
Para crear una clave externa en cualquier tabla
ALTER TABLE [SCHEMA].[TABLENAME] ADD FOREIGN KEY (COLUMNNAME) REFERENCES [TABLENAME](COLUMNNAME)
EXAMPLE
ALTER TABLE [dbo].[UserMaster] ADD FOREIGN KEY (City_Id) REFERENCES [dbo].[CityMaster](City_Id)
Si desea crear dos columnas de una tabla en una relación mediante una consulta, intente lo siguiente:
Alter table Foreign_Key_Table_name add constraint
Foreign_Key_Table_name_Columnname_FK
Foreign Key (Column_name) references
Another_Table_name(Another_Table_Column_name)
También puede nombrar su restricción de clave externa usando:
CONSTRAINT your_name_here FOREIGN KEY (question_exam_id) REFERENCES EXAMS (exam_id)
Y si solo desea crear la restricción por sí mismo, puede usar ALTER TABLE
alter table MyTable
add constraint MyTable_MyColumn_FK FOREIGN KEY ( MyColumn ) references MyOtherTable(PKColumn)
No recomendaría la sintaxis mencionada por Sara Chipps para la creación en línea, solo porque preferiría nombrar mis propias restricciones.
create table question_bank
(
question_id uniqueidentifier primary key,
question_exam_id uniqueidentifier not null constraint fk_exam_id foreign key references exams(exam_id),
question_text varchar(1024) not null,
question_point_value decimal
);
- Eso también funcionará. ¿Tal vez un constructo un poco más intuitivo?
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 fk_questionbank_exams foreign key (question_exam_id) references exams (exam_id)
);