Scenariusz:
Utworzono dwie tabele dbo.Customer i dbo.Orders bez relacji klucza podstawowego i obcego. Po utworzeniu tabel wstawiłeś kilka rekordów. Później zdałeś sobie sprawę, że powinieneś dodać ograniczenie klucza obcego. Podczas próby zmiany tabeli dbo.Orders wystąpił błąd.Utwórz tabele dbo.Customer i Dbo.Order za pomocą poniższego skryptu
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, CustomerId int )Wstaw przykładowe rekordy za pomocą poniższego skryptu.
INSERT INTO dbo.Customer (CustomerId,FName, LName,SSN) VALUES (1,'Aamir','Shahzad','000-000-00') INSERT INTO dbo.Orders (OrderItemName,OrderItemAmt,Customerid) values ('TV',2,2)Teraz dodajmy ograniczenie klucza obcego
Alter table dbo.Orders Add Constraint Fk_CustomerId Foreign Key(CustomerId) References dbo.Customer(CustomerId)Kiedy wykonujemy powyższy skrypt, otrzymujemy błąd poniżej.
Msg 547, Level 16, State 0, Line 31
Instrukcja ALTER TABLE była w konflikcie z ograniczeniem FOREIGN KEY "Fk_CustomerId". Konflikt wystąpił w bazie danych "YourDatabaseName", tabeli "dbo.Customer", kolumnie "Customerid".
Ponieważ dbo.Customer ma wartość 1 dla kolumny CustomerId, a w kolumnie tabeli dbo.Orders CustomerId ma wartość 2 Wartości nie pasują do siebie. To jest powód, dla którego otrzymaliśmy powyższy błąd.
Rozwiązania:
1) Napraw dane w drugiej tabeli (dbo.Orders) Możemy poprawić dane w drugiej tabeli i zaktualizować wartości kolumny CustomerId. Gdy będziemy mieli poprawne dane, które pasują do naszej tabeli podstawowej ( Dbo.Customer.CustomerId), pozwoli nam to bez problemu utworzyć ograniczenie klucza obcego.2) Użyj opcji Alter Table with Nocheck (Ignoruj istniejące dane ) Jeśli nie zależy Ci na relacji istniejących danych. Możesz użyć With NoCheck z instrukcją alter table i zignoruje to sprawdzenie, aby sprawdzić poprawność danych i utworzyć ograniczenie klucza obcego. Po utworzeniu ograniczenia klucza obcego wymusi ono integralność wszystkich wstawionych nowych rekordów.
Alter table dbo.Orders with Nocheck Add Constraint Fk_CustomerId Foreign Key(CustomerId) References dbo.Customer(CustomerId)
Video Demo