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=100 Mộ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=1 Kiể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=100
Kí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