Сценарий:
Вие работите като разработчик на SQL Server, написахте изявление за актуализиране за една от таблицата и получавате грешка по-долу.Съобщение 547, ниво 16, състояние 0, ред 32
Инструкцията UPDATE е в конфликт с ограничението REFERENCE "FK_".
Конфликтът възникна в базата данни „YourDatabaseName“, таблица „SchemaName.YourTableName“, колона „ColumnName“.
Изявлението е прекратено.
Как да разреша този проблем?
Решение:
Нека първо създадем тази грешка, като използваме скрипта по-долу. Ще създадем две таблици dbo.Customer и dbo.Orders. Таблиците имат връзка първичен-външен ключ.ИЗПОЛЗВАЙТЕ YourDatabaseNameGOCREATE TABLE dbo.Customer (Идентификация на клиента INT ПЪРВИЧЕН КЛЮЧ ,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 ВЪНШНИ КЛЮЧЕВИ РЕФЕРЕНЦИИ Customer(CustomerId) ) --insert. ,SSN) стойности (1,'Aamir','Shahzad','000-000-00') вмъкнете в dbo.Orders (OrderItemName,OrderItemAmt,Customer_Id) стойности ('TV',1,1)
Как да актуализирате записа, когато колоната е посочена от ограничение на външния ключ в SQL Server |
Сега да кажем, че смятате, че стойността на CustomerId е неправилна в dbo.Customer и трябва да бъде актуализирана. Написахте по-долу изявление за актуализиране, за да актуализирате CustomerId до 100.
актуализиране на dbo.Customer set Customerid=100
Ще получите грешка по-долу.
Съобщение 547, ниво 16, състояние 0, ред 33Изявлението UPDATE е в конфликт с ограничението REFERENCE "FK__Orders__Customer__1ED998B2". Конфликтът е възникнал в базата данни "YourDatabaseName", таблица "dbo.Orders", колона "Customer_id". Изявлението е прекратено.
Тъй като няма стойност на Customer_id=100 в таблицата dbo.Orders, не можете да актуализирате записа в справочната таблица. Сега си помислихте, че нека първо поправим родителската таблица ( dbo.Orders) и след това мога да актуализирам таблицата dbo.Customer.
актуализиране на dbo.Orders set Customer_Id=100Отново получихте грешката, както е показано по-долу, защото нямаме наличен CustomerId=100 в таблицата dbo.Customer.
Съобщение 547, ниво 16, състояние 0, ред 36 Изявлението UPDATE противоречи на ограничението FOREIGN KEY „FK__Orders__Customer_2 ". Конфликтът е възникнал в база данни „YourDatabaseName“, таблица „dbo.Customer“, колона „Customerid“. Изявлението е прекратено.
Оттук можем да излезем с множество решения 1) Вместо да актуализирате записа, вмъкнете записа в справочна таблица ( Dbo.Customer), след това актуализирайте записа в родителска таблица (Dbo.Orders) и накрая изтрийте съществуващите записи от справочна таблица.
--Insert Запис в референтната таблица Първо вмъкнете в dbo. Стойности на клиента (CustomerId,FName, LName,SSN) (100,'Aamir','Shahzad','000-000-00') -- Актуализирайте записите в родителската таблица, актуализирайте dbo. Зададени поръчки Customer_Id=100 --Изтриване на стария запис от справочна таблица Изтриване от dbo.Customer, където CustomerId=1Проверете записите в таблицата сега.
Как да актуализирате стойността на колоната, когато се препраща от ограничение на външния ключ в SQL Server |
2) Деактивирайте ограничението за външния ключ и актуализирайте стойностите ръчно Друго решение може да бъде деактивиране на ограничението на външния ключ, актуализиране на записите и накрая активиране на външния ключ отново.
--Намерете ограничението на външния ключ с име на таблица ИЗПОЛЗВАЙТЕ YourDatabaseName GO Изберете Schema_name(Schema_id) като SchemaName, object_name(Parent_object_id) като TableName, име като ForeignKeyConstraintName от sys.foreign_keys
Деактивирайте ограничението на външния ключ, като използвате изявлението по-долу
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
Използвах оператора по-долу, за да деактивирам ограничението на външния ключ в таблицата dbo.Orders.
--Деактивирайте Foregin Key с помощта на NOCHECKALTER TABLE dbo.OrdersNOCHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E--Изпълнете Update Statements update dbo.Customer set Customerid=100 update dbo.Orders set Customer=100 Активиране на ограничението на външния ключ SyntaxALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name
Изпълнявам скрипта по-долу, за да активирам ограничението на външния ключ в таблицата dbo.Orders.--Активирайте ограничението на външния ключ с помощта на CHECKALTER ТАБЛИЦА dbo.Поръчки ПРОВЕРКА НА ОГРАНИЧЕНИЕ FK__Поръчки__Клиент__2A4B4B5E
Видео демонстрация:Инструкцията UPDATE е в конфликт с ограничението REFERENCE