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

Инструкцията ALTER TABLE е в конфликт с ограничението FOREIGN KEY в SQL Server - SQL Server / TSQL Урок, част 69

Сценарий:

Създадохте две таблици dbo.Customer и dbo.Orders без връзка първичен-външен ключ. След създаването на таблици сте вмъкнали няколко записа. По-късно разбрахте, че е трябвало да добавите ограничение на външния ключ. Когато се опитахте да промените таблицата dbo.Orders , получихте грешка.

Създайте таблици dbo.Customer и Dbo.Order с помощта на скрипта по-долу

ИЗПОЛЗВАЙТЕ ИМЕТО на вашата база данниGOCREATE 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(1,1) ,OrderitemName(100) CustomerId int )
 Вмъкнете примерни записи, като използвате скрипта по-долу.

 ВМЕСЕТЕ В dbo.Customer (CustomerId,FName, LName,SSN) СТОЙНОСТИ (1,'Aamir','Shahzad','000-000- 00') INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,Customerid) стойности ('TV',2,2)
 Сега нека добавим ограничение на външния ключ

 Промяна на таблицата dbo.Orders Добавяне на ограничение Fk_CustomerId Външен ключ(CustomerId) Препратки dbo.Customer(CustomerId)
 
 
 Когато изпълним горния скрипт, получаваме грешка по-долу.

Съобщение 547, ниво 16, състояние 0, ред 31
Изразът ALTER TABLE е в конфликт с ограничението FOREIGN KEY "Fk_CustomerId". Конфликтът е възникнал в базата данни "YourDatabaseName", таблица "dbo.Customer", колона "Customerid".

Тъй като dbo.Customer има стойност 1 за колона CustomerId и в dbo.Orders таблицата колона CustomerId има стойност 2 Стойностите не съвпадат една с друга. Това е причината да получим горната грешка.

Решения:

1) Коригирайте данните във втората таблица (dbo.Orders) Можем да коригираме данните във втората таблица и да актуализираме стойностите на колоната CustomerId. След като имаме правилни данни, които съвпадат с нашата първична таблица ( Dbo.Customer.CustomerId), това ще ни позволи да създадем ограничение на външния ключ без никакъв проблем.
2) Използвайте Alter Table с Nocheck (Игнорирайте съществуващите данни ) Ако не ви интересува връзката на съществуващите данни. Можете да използвате With NoCheck with alter table statement и той ще игнорира проверката, за да потвърди данните и да създаде ограничение на външния ключ. След като бъде създадено ограничението за външния ключ, то ще наложи целостта за всички вмъкнати нови записи.
 Променете таблицата dbo.Orders с Nocheck Добавяне на ограничение Fk_CustomerId Външен ключ(CustomerId) Референции dbo.Customer(CustomerId) 
 
 
 
 
Видео демонстрация 
 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво да направите за типа на изчакване на ASYNC NETWORK IO?

  2. Преименувайте чужд ключ в SQL Server с помощта на T-SQL

  3. IDENT_CURRENT срещу @@IDENTITY срещу SCOPE_IDENTITY в SQL Server:Каква е разликата?

  4. Как TRY_CONVERT() работи в SQL Server

  5. Списък с формати за дата, налични с CONVERT() в SQL Server