Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

A instrução UPDATE entrou em conflito com a restrição REFERENCE - SQL Server / TSQL Tutorial Part 76

Cenário:

Você está trabalhando como desenvolvedor do SQL Server, você escreveu uma instrução de atualização para uma das tabelas e está recebendo o erro abaixo.


Msg 547, Level 16, State 0, Line 32
A instrução UPDATE entrou em conflito com a restrição REFERENCE "FK_".
O conflito ocorreu no banco de dados "YourDatabaseName", tabela "SchemaName.YourTableName", coluna 'ColumnName'.
A instrução foi encerrada.

Como resolver esse problema?

Solução:

Vamos criar este erro primeiro usando o script abaixo. Vamos criar duas tabelas dbo.Customer e dbo.Orders. As tabelas têm relação de chave estrangeira primária.

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)
 
 
Como atualizar o registro quando a coluna é referenciada pela restrição de chave estrangeira no SQL Server

Agora vamos dizer que você sente que o valor CustomerId está incorreto em dbo.Customer e precisa ser atualizado. Você escreveu abaixo a instrução de atualização para atualizar CustomerId para 100.
    update dbo.Customer
    set Customerid=100
 
Você receberá o erro abaixo.
Msg 547, Level 16, State 0, Line 33A instrução UPDATE entrou em conflito com a restrição REFERENCE "FK__Orders__Customer__1ED998B2". O conflito ocorreu no banco de dados "YourDatabaseName", tabela "dbo.Orders", coluna 'Customer_id'. A instrução foi encerrada.
Como não há valor de Customer_id =100 na tabela dbo.Orders, não é possível atualizar o registro na tabela de referência. Agora você pensou que vamos corrigir a tabela Pai primeiro ( dbo.Orders) e então eu posso atualizar a tabela dbo.Customer.
    update dbo.Orders
    set Customer_Id=100
 
 
 Novamente você obteve o erro conforme mostrado abaixo, pois não temos CustomerId=100 disponível na tabela dbo.Customer.
Msg 547, Level 16, State 0, Line 36A instrução UPDATE entrou em conflito com a restrição FOREIGN KEY "FK__Orders__Customer__1ED998B2 ". O conflito ocorreu no banco de dados "YourDatabaseName", tabela "dbo.Customer", coluna 'Customerid'. A instrução foi encerrada.

A partir daqui podemos chegar a várias soluções 1) Ao invés de atualizar o registro, insira o registro na Tabela de Referência ( Dbo.Customer), então atualize o registro na Tabela Pai (Dbo.Orders) e por fim exclua os registros existentes da Tabela de Referência.
    --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 os registros na tabela agora.
Como atualizar o valor da coluna quando referenciado pela restrição de chave estrangeira no SQL Server

2) Desabilite a restrição de chave estrangeira e atualize os valores manualmente Outra solução pode ser, desabilitar a restrição de chave estrangeira, atualizar os registros e finalmente habilitar a chave estrangeira novamente.
--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
 
 
Desabilite a restrição de chave estrangeira usando a instrução abaixo
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
Eu usei a instrução abaixo para desabilitar a restrição de chave estrangeira na tabela 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

Sintaxe de Habilitar Restrição de Chave EstrangeiraALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name

Eu executo o script abaixo para Habilitar Restrição de Chave Estrangeira na tabela dbo.Orders.
--Enable Foreign Key Constraint by using CHECK
ALTER TABLE dbo.Orders
CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E


Demonstração de vídeo :a instrução UPDATE entrou em conflito com a restrição REFERENCE