Scenario:
Du arbetar som SQL Server-utvecklare, Du skrev en uppdateringssats för en av tabellerna och får felet nedan.Msg 547, Level 16, State 0, Line 32
UPDATE-satsen kom i konflikt med REFERENCE-begränsningen "FK_".
Konflikten uppstod i databasen "YourDatabaseName", tabell "SchemaName.YourTableName", kolumn "ColumnName".
Utsatsen har avslutats.
Hur löser man problemet?
Lösning:
Låt oss skapa detta fel först genom att använda skriptet nedan. Vi kommer att skapa två tabeller dbo.Customer och dbo.Orders. Tabellerna har en primär-utländsk nyckelrelation.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)
Hur man uppdaterar posten när kolumn refereras av Foreign Key Constraint i SQL Server |
Låt oss nu säga om du känner att CustomerId-värdet är felaktigt i dbo.Customer och behöver uppdateras. Du skrev nedan uppdaterade uttalande för att uppdatera CustomerId till 100.
update dbo.Customer set Customerid=100
Du kommer att få under felet.
Medd. 547, nivå 16, tillstånd 0, rad 33Uppdateringssatsen kom i konflikt med REFERENCE-begränsningen "FK__Orders__Customer__1ED998B2". Konflikten inträffade i databasen "YourDatabaseName", tabellen "dbo.Orders", kolumnen "Customer_id". Uttalandet har avslutats.
Eftersom det inte finns något Customer_id value=100 i tabellen dbo.Orders, kan du inte uppdatera posten i referenstabellen. Nu tänkte du att låt oss fixa den överordnade tabellen först ( dbo.Orders) och sedan kan jag uppdatera tabellen dbo.Customer.
update dbo.Orders set Customer_Id=100Återigen fick du felet som visas nedan, eftersom vi inte har CustomerId=100 tillgängligt i dbo.Kundtabell.
Medd. 547, nivå 16, tillstånd 0, rad 36Uppdateringssatsen stod i konflikt med FOREIGN KEY-begränsningen "FK__Orders__Customer__1ED998B2 ". Konflikten uppstod i databasen "YourDatabaseName", tabell "dbo.Customer", kolumn "Customerid". Uttalandet har avslutats.
Härifrån kan vi komma med flera lösningar 1) Istället för att uppdatera posten, infoga posten i referenstabell ( Dbo.Customer), uppdatera sedan posten i överordnad tabell (Dbo.Orders) och ta slutligen bort de befintliga posterna från referenstabellen.
--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=1Kontrollera posterna i tabellen nu.
Hur man uppdaterar kolumnvärde när det refereras av Foreign Key Constraint i SQL Server |
2) Inaktivera begränsningen för främmande nyckel och uppdatera värdena manuellt En annan lösning kan vara, inaktivera begränsningen för främmande nyckel, uppdatera posterna och slutligen aktivera den främmande nyckeln igen.
--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
Inaktivera begränsningen för främmande nyckel genom att använda satsen nedan
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
Jag använde satsen nedan för att inaktivera begränsningen för främmande nyckel på tabellen 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=100Aktivera syntax för främmande nyckelbegränsning ALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name
Jag kör nedanstående skript för att aktivera utländsk nyckelbegränsning på dbo.Orders-tabellen.
--Enable Foreign Key Constraint by using CHECK ALTER TABLE dbo.Orders CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E
Videodemo :UPDATE-satsen stod i konflikt med REFERENS-begränsningen