Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Câu lệnh UPDATE xung đột với ràng buộc THAM KHẢO - Hướng dẫn SQL Server / TSQL Phần 76

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Khắc phục sự cố khi làm việc với ngày và giờ trong SQL Server

  2. Sự khác biệt giữa Người dùng và Đăng nhập trong SQL Server

  3. THAM GIA TRÁI so với LEFT OUTER THAM GIA trong SQL Server

  4. Cách tạo nhiều cái cho một cái

  5. Mã khung thực thể đầu tiên với từ đồng nghĩa SQL Server