Tình huống:
Bạn đang làm việc với tư cách là nhà phát triển SQL Server, Bạn đã viết một câu lệnh cập nhật cho một trong các bảng và gặp lỗi bên dưới.Msg 547, Level 16, State 0, Line 32
Câu lệnh UPDATE đã xung đột với ràng buộc REFERENCE "FK_".
Xung đột xảy ra trong cơ sở dữ liệu "YourDatabaseName", bảng "SchemaName.YourTableName", cột 'ColumnName'.
Câu lệnh đã bị chấm dứt.
Làm thế nào để giải quyết vấn đề này?
Giải pháp:
Hãy tạo lỗi này trước bằng cách sử dụng tập lệnh dưới đây. Chúng ta sẽ tạo hai bảng dbo.Customer và dbo.Orders. Các bảng có Mối quan hệ chính-khóa ngoài.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)
Cách cập nhật bản ghi khi Cột được tham chiếu bởi Ràng buộc khóa ngoài trong SQL Server |
Bây giờ, hãy nói nếu bạn cảm thấy rằng giá trị CustomerId không chính xác trong dbo.Customer và cần được cập nhật. Bạn đã viết câu lệnh cập nhật bên dưới để cập nhật CustomerId lên 100.
update dbo.Customer set Customerid=100
Bạn sẽ gặp lỗi dưới đây.
Msg 547, Level 16, State 0, Line 33 Câu lệnh UPDATE xung đột với ràng buộc REFERENCE "FK__Orders__Customer__1ED998B2". Xung đột xảy ra trong cơ sở dữ liệu "YourDatabaseName", bảng "dbo.Orders", cột 'Customer_id'. Câu lệnh đã bị chấm dứt.
Vì không có giá trị Customer_id =100 trong bảng dbo.Orders, bạn không thể cập nhật bản ghi trong bảng tham chiếu. Bây giờ bạn nghĩ rằng hãy sửa bảng Gốc trước (dbo.Orders) và sau đó tôi có thể cập nhật bảng dbo.Customer.
update dbo.Orders set Customer_Id=100Một lần nữa, bạn lại gặp lỗi như hình dưới đây, vì chúng tôi không có sẵn CustomerId =100 trong bảng dbo.Customer.
Msg 547, Level 16, State 0, Line 36 Câu lệnh UPDATE xung đột với ràng buộc FOREIGN KEY "FK__Orders__Customer__1ED998B2 ". Xung đột xảy ra trong cơ sở dữ liệu "YourDatabaseName", bảng "dbo.Customer", cột 'Customerid'. Câu lệnh đã bị chấm dứt.
Từ đây, chúng tôi có thể đưa ra nhiều giải pháp 1) Thay vì cập nhật bản ghi, hãy Chèn bản ghi vào Bảng tham chiếu (Dbo.Customer), Sau đó cập nhật bản ghi trong bảng Gốc (Dbo.Orders) và cuối cùng xóa các bản ghi hiện có khỏi Bảng tham chiếu.
--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=1Kiểm tra các bản ghi trong bảng ngay bây giờ.
Cách cập nhật Giá trị cột khi được tham chiếu bởi Ràng buộc khóa ngoại trong SQL Server |
2) Vô hiệu hóa Ràng buộc khóa ngoại và cập nhật giá trị theo cách thủ công Một giải pháp khác có thể là vô hiệu hóa ràng buộc Khóa ngoại, cập nhật các bản ghi và cuối cùng là bật lại Khóa ngoại.
--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
Tắt ràng buộc khóa ngoại bằng cách sử dụng câu lệnh dưới đây
SyntaxALTER TABLE SchemaName.ParentTableNameNOCHECK CONSTRAINT Constraint_Name
Tôi đã sử dụng câu lệnh dưới đây để tắt ràng buộc khóa ngoại trên bảng 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=100Kích hoạt tính năng ràng buộc khóa ngoài Cú pháp Lược đồ Lược đồ. Tên.ParentTableNameCHECK CONSTRAINT Constraint_Name
Tôi thực thi tập lệnh dưới đây để Bật ràng buộc khóa ngoại trên bảng dbo.Orders.
--Enable Foreign Key Constraint by using CHECK ALTER TABLE dbo.Orders CHECK CONSTRAINT FK__Orders__Customer__2A4B4B5E
Video Demo:Tuyên bố CẬP NHẬT xung đột với Ràng buộc THAM KHẢO