Scenarie:
Du arbejder som SQL Server-udvikler. Du skrev en opdateringssætning til en af tabellerne og får fejlen nedenfor.Msg 547, Level 16, State 0, Line 32
UPDATE-sætningen var i konflikt med REFERENCE-begrænsningen "FK_".
Konflikten opstod i databasen "YourDatabaseName", tabel "SchemaName.YourTableName", kolonnen 'ColumnName'.
Sætningen er blevet afsluttet.
Hvordan løser man dette problem?
Løsning:
Lad os først oprette denne fejl ved at bruge nedenstående script. Vi skal lave to tabeller dbo.Customer og dbo.Orders. Tabellerne har primær-udenlandsk nøglerelation.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)
Sådan opdateres posten, når der henvises til kolonnen af Foreign Key Constraint i SQL Server |
Lad os nu sige, hvis du føler, at CustomerId-værdien er forkert i dbo.Customer og skal opdateres. Du skrev nedenstående opdateringserklæring for at opdatere CustomerId til 100.
update dbo.Customer set Customerid=100
Du vil få fejlen under.
Besked 547, niveau 16, tilstand 0, linje 33. UPDATE-sætningen var i konflikt med REFERENCE-begrænsningen "FK__Orders__Customer__1ED998B2". Konflikten opstod i databasen "YourDatabaseName", tabel "dbo.Orders", kolonne 'Customer_id'. Udsagnet er blevet afsluttet.
Da der ikke er nogen Customer_id value=100 i dbo.Orders-tabellen, kan du ikke opdatere posten i referencetabel. Nu tænkte du, at lad os reparere overordnede tabellen først ( dbo.Orders), og så kan jeg opdatere tabellen dbo.Customer.
update dbo.Orders set Customer_Id=100Igen fik du fejlen som vist nedenfor, fordi vi ikke har CustomerId=100 tilgængelig i dbo.Kundetabel.
Besked 547, niveau 16, tilstand 0, linje 36. UPDATE-sætningen var i konflikt med FOREIGN KEY-begrænsningen "FK__Orders__Customer__1ED998B2 ". Konflikten opstod i databasen "YourDatabaseName", tabel "dbo.Customer", kolonne 'Customerid'. Erklæringen er blevet afsluttet.
Herfra kan vi komme med flere løsninger 1) I stedet for at opdatere posten, Indsæt posten i Referencetabel ( Dbo.Customer), Opdater derefter posten i Overordnet tabel (Dbo.Orders) og slet til sidst de eksisterende poster fra Referencetabel.
--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=1Tjek posterne i tabellen nu.
Sådan opdaterer du kolonneværdi, når der refereres til af Foreign Key Constraint i SQL Server |
2) Deaktiver fremmednøglebegrænsningen og opdater værdierne manuelt En anden løsning kan være at deaktivere Foreign Key-begrænsningen, opdatere posterne og til sidst aktivere Foreign-nøglen 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
Deaktiver Foreign Key Constraint ved at bruge nedenstående sætning
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
Jeg brugte nedenstående sætning til at deaktivere Foreign Key constraint på dbo.Orders-tabellen.
--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=100Aktiver Foreign Key Constraint SyntaxALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name
Jeg udfører nedenstående script for at aktivere Foreign Key Constraint på dbo.Orders-tabellen.
--Enable Foreign Key Constraint by using CHECK ALTER TABLE dbo.Orders CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E
Videodemo :UPDATE-sætningen var i konflikt med REFERENCE-begrænsningen