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=100 Igen 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=1 Tjek 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=100
Aktiver Foreign Key Constraint SyntaxALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_NameJeg 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

