sql >> Base de Datos >  >> RDS >> Sqlserver

La declaración ALTER TABLE entró en conflicto con la restricción FOREIGN KEY en SQL Server - SQL Server / TSQL Tutorial Parte 69

Escenario:

Ha creado dos tablas dbo.Customer y dbo.Orders sin tener una relación de clave externa principal. Después de crear tablas, insertó algunos registros. Más tarde se dio cuenta de que se suponía que debía agregar la restricción de clave externa. Cuando intentó modificar la tabla dbo.Orders, recibió un error.

Cree las tablas dbo.Customer y Dbo.Order usando el siguiente script

USE YourDatabaseName
GO

CREATE TABLE dbo.Customer (
    Customerid INT PRIMARY KEY
    ,FName VARCHAR(100)
    ,LName VARCHAR(100)
    ,SSN VARCHAR(10)
    )

CREATE TABLE dbo.Orders (
    OrderId INT Identity(1, 1)
    ,OrderitemName VARCHAR(50)
    ,OrderItemAmt INT,
    CustomerId int
    )
 Inserte registros de muestra utilizando el siguiente script.

     INSERT INTO dbo.Customer 
    (CustomerId,FName, LName,SSN)
     VALUES
    (1,'Aamir','Shahzad','000-000-00')

    INSERT INTO dbo.Orders
    (OrderItemName,OrderItemAmt,Customerid)
    values ('TV',2,2)
 Ahora agreguemos la restricción de clave externa

    Alter table dbo.Orders
    Add Constraint Fk_CustomerId  
    Foreign Key(CustomerId) References dbo.Customer(CustomerId)
 
 
 Cuando ejecutamos el script anterior, obtenemos el siguiente error.

Mensaje 547, Nivel 16, Estado 0, Línea 31
La declaración ALTER TABLE entró en conflicto con la restricción FOREIGN KEY "Fk_CustomerId". El conflicto ocurrió en la base de datos "YourDatabaseName", tabla "dbo.Customer", columna 'Customerid'.

Como dbo.Customer tiene el valor 1 para la columna CustomerId y en la columna de la tabla dbo.Orders CustomerId tiene el valor 2 Los valores no coinciden entre sí. Esa es la razón por la que recibimos el error anterior.

Soluciones:

1) Corrige los datos en la segunda tabla (dbo.Orders) Podemos corregir los datos en la segunda tabla y actualizar los valores de la columna CustomerId. Una vez que tengamos los datos correctos que coincidan con nuestra tabla principal (Dbo.Customer.CustomerId), nos permitirá crear una restricción de clave externa sin ningún problema.
2) Use Alter Table with Nocheck (Ignore los datos existentes ) Si no le importa la relación de los datos existentes. Puede usar With NoCheck con la declaración de modificación de la tabla e ignorará la verificación para validar los datos y crear una restricción de clave externa. Una vez que se crea la restricción de clave externa, hará cumplir la integridad de cualquier registro nuevo insertado.
    Alter table dbo.Orders with Nocheck
    Add Constraint Fk_CustomerId  
    Foreign Key(CustomerId) References dbo.Customer(CustomerId)
 
 


Video Demo