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