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

A instrução ALTER TABLE entrou em conflito com a restrição FOREIGN KEY no SQL Server - SQL Server/TSQL Tutorial Part 69

Cenário:

Você criou duas tabelas dbo.Customer e dbo.Orders sem ter um relacionamento de chave primária-estrangeira. Após criar as tabelas você inseriu alguns registros. Mais tarde, você percebeu que deveria adicionar a restrição de chave estrangeira. Ao tentar alterar a tabela dbo.Orders, você recebeu um erro.

Crie as tabelas dbo.Customer e Dbo.Order usando o script abaixo

USE YourDatabaseNameGOCREATE 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 )
 Insira registros de amostra usando o script abaixo.

 INSERT INTO dbo.Customer (CustomerId,FName, LName,SSN) VALUES (1,'Aamir','Shahzad','000-000- 00') INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,Customerid) valores ('TV',2,2)
 Agora vamos adicionar restrição de chave estrangeira

 Alterar tabela dbo.Orders Adicionar restrição Fk_CustomerId Chave estrangeira(CustomerId) Referências dbo.Customer(CustomerId)
 
 
 Quando executamos o script acima, obtemos o erro abaixo.

Msg 547, Level 16, State 0, Line 31
A instrução ALTER TABLE entrou em conflito com a restrição FOREIGN KEY "Fk_CustomerId". O conflito ocorreu no banco de dados "YourDatabaseName", tabela "dbo.Customer", coluna 'Customerid'.

Como dbo.Customer tem valor 1 para a coluna CustomerId e na tabela dbo.Orders a coluna CustomerId tem valor 2 .Os valores não coincidem entre si. Essa é a razão pela qual recebemos o erro acima.

Soluções:

1) Corrija os dados na segunda tabela (dbo.Orders) Podemos corrigir os dados na segunda tabela e atualizar os valores da coluna CustomerId. Assim que tivermos dados corretos que correspondam à nossa Tabela Primária ( Dbo.Customer.CustomerId), ela nos permitirá criar Restrição de Chave Estrangeira sem nenhum problema.
2) Use Alter Table with Nocheck ( Ignore dados existentes ) Se você não se importa com o relacionamento dos dados existentes. Você pode usar With NoCheck com a instrução alter table e ele ignorará a verificação para validar dados e criar restrição de chave estrangeira. Depois que a restrição de chave estrangeira for criada, ela imporá integridade para quaisquer novos registros inseridos.
 Alterar tabela dbo.Orders com Nocheck Adicionar restrição Fk_CustomerId Chave estrangeira(CustomerId) Referências dbo.Customer(CustomerId) 
 
 
 
 
Demonstração em vídeo