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