Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Инструкцията UPDATE е в конфликт с ограничението REFERENCE - SQL Server / TSQL урок, част 76

Сценарий:

Вие работите като разработчик на 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да увеличите размера на файла с данни в SQL Server (T-SQL)

  2. Разбиране на размера на съхранение на „време“ в SQL Server

  3. Променете типовете колони в огромна таблица

  4. Как да покажете съпоставянето на база данни в SQL Server (T-SQL)

  5. Защо select SCOPE_IDENTITY() връща десетичен знак вместо цяло число?