sql >> Databasteknik >  >> RDS >> Sqlserver

ALTER TABLE-satsen kom i konflikt med FOREIGN KEY-begränsningen i SQL Server - SQL Server / TSQL Tutorial Del 69

Scenario:

Du har skapat två tabeller dbo.Customer och dbo.Orders utan att ha en primär-utländsk nyckelrelation. Efter att ha skapat tabeller infogade du några poster. Senare insåg du att det var meningen att du skulle lägga till Foreign Key Constraint. När du försökte ändra dbo.Orders-tabellen fick du ett felmeddelande.

Skapa dbo.Customer- och Dbo.Order-tabeller genom att använda nedanstående skript

ANVÄND 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(Orderem)Amt INT,Item) CustomerId int )
 Infoga exempelposter genom att använda nedanstående skript.

 INSERT INTO dbo.Customer (CustomerId,FName, LName,SSN) VALUES (1,'Aamir','Shahzad','000-000- 00') INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,Customerid) värden ('TV',2,2)
 Låt oss nu lägga till begränsning för utländsk nyckel

 Ändra tabell dbo.Orders Lägg till begränsning Fk_CustomerId Foreign Key(CustomerId) Referenser dbo.Customer(CustomerId)
 
 
 När vi kör ovanstående skript får vi ett fel under.

Msg 547, Level 16, State 0, Rad 31
ALTER TABLE-satsen kom i konflikt med FOREIGN KEY-begränsningen "Fk_CustomerId". Konflikten uppstod i databasen "YourDatabaseName", tabell "dbo.Customer", kolumn 'Customerid'.

Eftersom dbo.Customer har värde 1 för CustomerId-kolumnen och i dbo.Orders-tabellkolumnen CustomerId har värde 2 Värdena stämmer inte överens med varandra. Det är anledningen till att vi fick ovanstående fel.

Lösningar:

1) Fixa data i den andra tabellen (dbo.Orders) Vi kan fixa data i den andra tabellen och uppdatera kund-ID-kolumnvärdena. När vi väl har korrekta data som matchar vår primära tabell ( Dbo.Customer.CustomerId) låter den oss skapa en utländsk nyckelbegränsning utan problem.
2) Använd Alter-tabell med Nocheck ( Ignorera befintlig data ) Om du inte bryr dig om förhållandet mellan befintliga data. Du kan använda With NoCheck med alter table statement och den ignorerar kontrollen för att validera data och skapa Foreign Key Constraint. När den främmande nyckelbegränsningen har skapats kommer den att upprätthålla integritet för alla nya poster som infogas.
 Ändra tabell dbo.Orders med Nocheck Add Constraint Fk_CustomerId Foreign Key(CustomerId) References dbo.Customer(CustomerId) 
 
 
 
 
Videodemo 
 


  1. Sekvens vs identitet

  2. Returnera det lokala servernamnet i SQL Server med @@SERVERNAME

  3. SQLite Byt namn på kolumn

  4. SQLite CHECK-begränsningar