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=1 Kontrollera 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=100
Aktivera syntax för främmande nyckelbegränsning ALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_NameJag 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

