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

La instrucción UPDATE entró en conflicto con la restricción REFERENCE - Tutorial de SQL Server/TSQL, parte 76

Escenario:

Está trabajando como desarrollador de SQL Server, escribió una declaración de actualización para una de las tablas y obtuvo el siguiente error.


Mensaje 547, Nivel 16, Estado 0, Línea 32
La instrucción UPDATE entró en conflicto con la restricción REFERENCE "FK_".
El conflicto ocurrió en la base de datos "YourDatabaseName", tabla "SchemaName.YourTableName", columna 'ColumnName'.
La instrucción ha finalizado.

¿Cómo resolver este problema?

Solución:

Primero creemos este error usando el siguiente script. Vamos a crear dos tablas dbo.Customer y dbo.Orders. Las tablas tienen una relación de clave externa principal.

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
    ,Customer_id INT FOREIGN KEY REFERENCES Customer(CustomerId)
    )


    --insert sample data
     insert into dbo.Customer 
    (CustomerId,FName, LName,SSN)
     values
    (1,'Aamir','Shahzad','000-000-00')

    insert into dbo.Orders
    (OrderItemName,OrderItemAmt,Customer_Id)
    values ('TV',1,1)
 
 
Cómo actualizar el registro cuando la restricción de clave externa hace referencia a la columna en SQL Server

Ahora, digamos si cree que el valor de CustomerId es incorrecto en dbo.Customer y debe actualizarse. Usted escribió a continuación la declaración de actualización para actualizar CustomerId a 100.
    update dbo.Customer
    set Customerid=100
 
Obtendrá el siguiente error.
Mensaje 547, Nivel 16, Estado 0, Línea 33La declaración UPDATE entró en conflicto con la restricción REFERENCE "FK__Orders__Customer__1ED998B2". El conflicto ocurrió en la base de datos "YourDatabaseName", tabla "dbo.Orders", columna 'Customer_id'. La declaración ha terminado.
Como no hay un valor de Customer_id =100 en la tabla dbo.Orders, no puede actualizar el registro en la tabla de referencia. Ahora pensó que vamos a arreglar primero la tabla principal ( dbo.Orders) y luego puedo actualizar la tabla dbo.Customer.
    update dbo.Orders
    set Customer_Id=100
 
 
 De nuevo, recibió el error como se muestra a continuación, porque no tenemos CustomerId=100 disponible en la tabla dbo.Customer.
Mensaje 547, Nivel 16, Estado 0, Línea 36La instrucción UPDATE entró en conflicto con la restricción FOREIGN KEY "FK__Orders__Customer__1ED998B2 ". El conflicto ocurrió en la base de datos "YourDatabaseName", tabla "dbo.Customer", columna 'Customerid'. La declaración ha terminado.

A partir de aquí podemos encontrar varias soluciones 1) En lugar de actualizar el registro, inserte el registro en la tabla de referencia (Dbo.Customer), luego actualice el registro en la tabla principal (Dbo.Orders) y finalmente elimine los registros existentes de la tabla de referencia.
    --Insert Record in Reference Table First
     insert into dbo.Customer 
    (CustomerId,FName, LName,SSN)
     values
    (100,'Aamir','Shahzad','000-000-00')

    --Update the Records in Parent Table 
        update dbo.Orders
    set Customer_Id=100

    --Delete the old record from Reference Table
    Delete from dbo.Customer
    where CustomerId=1
 
 
 Verifique los registros en la tabla ahora.
Cómo actualizar el valor de columna cuando se hace referencia a una restricción de clave externa en SQL Server

2) Deshabilitar la restricción de clave externa y actualizar los valores manualmente Otra solución puede ser deshabilitar la restricción de clave externa, actualizar los registros y finalmente habilitar la clave externa nuevamente.
--Find the Foreign Key Constraint with Table Name
    USE YourDatabaseName
    GO
    Select 
    Schema_name(Schema_id) as SchemaName,
    object_name(Parent_object_id) as TableName,
    name as ForeignKeyConstraintName
    from sys.foreign_keys
 
 
Deshabilitar la restricción de clave foránea usando la siguiente declaración
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
Utilicé la siguiente declaración para deshabilitar la restricción de clave foránea en la tabla dbo.Orders.
--Disable Foregin Key by using NOCHECK
ALTER TABLE dbo.Orders
NOCHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E

--Run Update Statements
    update dbo.Customer
    set Customerid=100

    update dbo.Orders
    set Customer_Id=100

Habilitar restricción de clave externa Sintaxis ALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name

Ejecuto el siguiente script para habilitar la restricción de clave externa en la tabla dbo.Orders.
--Enable Foreign Key Constraint by using CHECK
ALTER TABLE dbo.Orders
CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E


Video de demostración:la declaración UPDATE entró en conflicto con la restricción REFERENCE