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=100Opě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=1Nyní 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=100Enable Foreign Key Constraint SyntaxALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name
Spustí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