Scénář:
Pracujete jako vývojář SQL Server, napsali jste aktualizační příkaz pro jednu z tabulek a dostáváte chybu níže.Zpráva 547, úroveň 16, stav 0, řádek 32
Příkaz UPDATE byl v konfliktu s omezením REFERENCE "FK_".
Konflikt nastal v databázi "YourDatabaseName", tabulce "SchemaName.YourTableName", sloupci 'ColumnName'.
Příkaz byl ukončen.
Jak tento problém vyřešit?
Řešení:
Pojďme nejprve vytvořit tuto chybu pomocí níže uvedeného skriptu. Vytvoříme dvě tabulky dbo.Customer a dbo.Orders. Tabulky mají vztah primární-cizí klíč.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) ![]() |
| Jak aktualizovat záznam, když na sloupec odkazuje omezení cizího klíče na serveru SQL |
Nyní řekněme, zda máte pocit, že hodnota CustomerId je v dbo.Customer nesprávná a je třeba ji aktualizovat. Níže jste napsali prohlášení o aktualizaci pro aktualizaci CustomerId na 100.
update dbo.Customer
set Customerid=100 Dostanete se pod chybu.
Zpráva 547, úroveň 16, stav 0, řádek 33 Příkaz UPDATE byl v konfliktu s omezením REFERENCE "FK__Orders__Customer__1ED998B2". Ke konfliktu došlo v databázi "YourDatabaseName", tabulce "dbo.Orders", sloupci 'Customer_id'. Příkaz byl ukončen.
Vzhledem k tomu, že v tabulce dbo.Orders není žádná hodnota Customer_id value=100, nemůžete aktualizovat záznam v referenční tabulce. Nyní jste si mysleli, že nejprve opravíme nadřazenou tabulku (dbo.Orders) a poté mohu aktualizovat tabulku dbo.Customer.
update dbo.Orders
set Customer_Id=100 Opět došlo k chybě, jak je uvedeno níže, protože v tabulce dbo.Customer nemáme k dispozici CustomerId=100.Zpráva 547, úroveň 16, stav 0, řádek 36 Příkaz UPDATE byl v konfliktu s omezením FOREIGN KEY "FK__Orders__Customer_21ED998 ". Ke konfliktu došlo v databázi "YourDatabaseName", tabulce "dbo.Customer", sloupci 'Customerid'. Příkaz byl ukončen.
Odtud můžeme přijít s více řešeními 1) Místo aktualizace záznamu vložte záznam do referenční tabulky (Dbo.Customer), poté aktualizujte záznam v nadřazené tabulce (Dbo.Orders) a nakonec odstraňte existující záznamy z referenční tabulky.
--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 Nyní zkontrolujte záznamy v tabulce. ![]() |
| Jak aktualizovat hodnotu sloupce, když na něj odkazuje omezení cizího klíče na serveru SQL |
2) Deaktivujte omezení cizího klíče a aktualizujte hodnoty ručně Dalším řešením může být deaktivace omezení cizího klíče, aktualizace záznamů a nakonec znovu povolení cizího klíče.
--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 Zakažte omezení cizího klíče pomocí níže uvedeného příkazu
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Název_mezi
Použil jsem níže uvedený příkaz k deaktivaci omezení cizího klíče v tabulce 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
Enable Foreign Key Constraint SyntaxALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_NameSpustím níže uvedený skript pro povolení omezení cizího klíče v tabulce dbo.Orders.
--Enable Foreign Key Constraint by using CHECK ALTER TABLE dbo.Orders CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E
Video ukázka:Prohlášení UPDATE bylo v rozporu s omezením REFERENCE

