Scenariusz:
Pracujesz jako programista SQL Server, napisałeś oświadczenie o aktualizacji dla jednej z tabel i pojawił się poniżej błąd.Msg 547, Level 16, State 0, Line 32
Instrukcja UPDATE kolidowała z ograniczeniem REFERENCE „FK_”.
Wystąpił konflikt w bazie danych "NazwaTwojejBazyDanych", tabela "NazwaSchematu.NazwaTwojejTabeli", kolumna "NazwaKolumny".
Wyciąg został zakończony.
Jak rozwiązać ten problem?
Rozwiązanie:
Najpierw stwórzmy ten błąd za pomocą poniższego skryptu. Zamierzamy stworzyć dwie tabele dbo.Customer i dbo.Orders. Tabele mają relację klucza podstawowego i obcego.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 ,Customer_id INT FOREIGN KEY REFERENCES Customer(CustomerId) ) --insert sample data insert into dbo.Customer (CustomerId,FName, LName,SSN) values (1,'Aamir','Shahzad','000-000-00') insert into dbo.Orders (OrderItemName,OrderItemAmt,Customer_Id) values ('TV',1,1)
Jak zaktualizować rekord, gdy do kolumny odwołuje się ograniczenie klucza obcego w SQL Server |
Teraz powiedzmy, czy uważasz, że wartość CustomerId w dbo.Customer jest nieprawidłowa i wymaga aktualizacji. Napisałeś poniżej oświadczenie aktualizujące, aby zaktualizować CustomerId do 100.
update dbo.Customer set Customerid=100
Otrzymasz błąd poniżej.
Msg 547, poziom 16, stan 0, wiersz 33. Instrukcja UPDATE była w konflikcie z ograniczeniem REFERENCE „FK__Orders__Customer__1ED998B2”. Konflikt wystąpił w bazie danych "YourDatabaseName", tabeli "dbo.Orders", kolumnie "Customer_id". Wyrażenie zostało zakończone.
Ponieważ w tabeli dbo.Orders nie ma wartości Customer_id=100, nie można zaktualizować rekord w tabeli referencyjnej. Teraz pomyślałeś, że najpierw naprawmy tabelę Parent (dbo.Orders), a potem mogę zaktualizować tabelę dbo.Customer.
update dbo.Orders set Customer_Id=100Ponownie pojawił się błąd, jak pokazano poniżej, ponieważ nie mamy dostępnego CustomerId=100 w tabeli dbo.Customer.
Msg 547, Level 16, State 0, Line 36. Instrukcja UPDATE była w konflikcie z ograniczeniem FOREIGN KEY „FK__Orders__Customer__1ED998B2 ”. Konflikt wystąpił w bazie danych "YourDatabaseName", tabeli "dbo.Customer", kolumnie "Customerid". Oświadczenie zostało zakończone.
Z tego miejsca możemy uzyskać wiele rozwiązań 1) Zamiast aktualizować rekord, Wstaw rekord w tabeli referencyjnej ( Dbo.Customer), następnie zaktualizuj rekord w tabeli nadrzędnej (Dbo.Orders) i na koniec usuń istniejące rekordy z tabeli referencyjnej.
--Insert Record in Reference Table First insert into dbo.Customer (CustomerId,FName, LName,SSN) values (100,'Aamir','Shahzad','000-000-00') --Update the Records in Parent Table update dbo.Orders set Customer_Id=100 --Delete the old record from Reference Table Delete from dbo.Customer where CustomerId=1Sprawdź teraz rekordy w tabeli.
Jak zaktualizować wartość kolumny, gdy odwołuje się do niej ograniczenie klucza obcego w programie SQL Server |
2) Wyłącz ograniczenie klucza obcego i ręcznie zaktualizuj wartości Innym rozwiązaniem może być wyłączenie ograniczenia klucza obcego, aktualizacja rekordów i ponowne włączenie klucza obcego.
--Find the Foreign Key Constraint with Table Name USE YourDatabaseName GO Select Schema_name(Schema_id) as SchemaName, object_name(Parent_object_id) as TableName, name as ForeignKeyConstraintName from sys.foreign_keys
Wyłącz ograniczenie klucza obcego za pomocą poniższej instrukcji
Składnia ALTER TABLE NazwaSchematu.NazwaTabeliNadrzędnejNOCHECK CONSTRAINT Nazwa_Ograniczenia
Użyłem poniższej instrukcji, aby wyłączyć ograniczenie klucza obcego w tabeli dbo.Orders.
--Disable Foregin Key by using NOCHECK ALTER TABLE dbo.Orders NOCHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E --Run Update Statements update dbo.Customer set Customerid=100 update dbo.Orders set Customer_Id=100Włącz ograniczenie klucza obcego Składnia ALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_Name
Wykonuję poniższy skrypt, aby włączyć ograniczenie klucza obcego w tabeli dbo.Orders.
--Enable Foreign Key Constraint by using CHECK ALTER TABLE dbo.Orders CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E
Wideo demonstracyjne:instrukcja UPDATE jest w konflikcie z ograniczeniem REFERENCE