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=100 Ponownie 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=1 Sprawdź 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=100
Włącz ograniczenie klucza obcego Składnia ALTER TABLE SchemaName.ParentTableNameCHECK CONSTRAINT Constraint_NameWykonuję 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

