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=100Novamente 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=1Verifique 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=100Sintaxe 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