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

Câu lệnh ALTER TABLE xung đột với ràng buộc FOREIGN KEY trong SQL Server - Hướng dẫn sử dụng SQL Sever / TSQL Phần 69

Tình huống:

Bạn đã tạo hai bảng dbo.Customer và dbo.Orders mà không có mối quan hệ khóa chính-ngoại. Sau khi tạo bảng, bạn đã chèn một vài bản ghi. Sau đó, bạn nhận ra rằng bạn phải thêm Ràng buộc khóa ngoại. Khi bạn cố gắng thay đổi bảng dbo.Orders, bạn đã nhận được lỗi.

Tạo bảng dbo.Customer và Dbo.Order bằng cách sử dụng tập lệnh bên dưới

 SỬ DỤNG YourDatabaseNameGOCREATE TABLE dbo .Khách hàng (Customerid INT PRIMARY KEY, FName VARCHAR (100), LName VARCHAR (100), SSN VARCHAR (10)) TẠO BẢNG dbo.Orders (OrderId INT Identity (1, 1), OrderitemName VARCHAR (50), OrderItemAmt INT, Int CustomerId) 
 
Chèn các bản ghi mẫu bằng cách sử dụng tập lệnh bên dưới.

 CHÈN VÀO dbo.Customer (CustomerId, FName, LName, SSN) VALUES (1, 'Aamir', 'Shahzad', '000-000- 00 ') CHÈN VÀO các giá trị dbo.Orders (OrderItemName, OrderItemAmt, Customerid) (' TV ', 2,2) 
 
Bây giờ, hãy thêm Ràng buộc khóa ngoài

 Bảng thay thế dbo. Đơn đặt hàng Thêm ràng buộc Fk_CustomerId Tham chiếu khóa ngoại (CustomerId) dbo.Customer (CustomerId) 
 
 
 
Khi chúng tôi thực thi tập lệnh trên, chúng tôi gặp lỗi dưới đây.

Msg 547, Level 16, State 0, Line 31
Câu lệnh ALTER TABLE xung đột với ràng buộc FOREIGN KEY "Fk_CustomerId". Xung đột đã xảy ra trong cơ sở dữ liệu "YourDatabaseName", bảng "dbo.Customer", cột 'Customerid'.

Vì dbo.Customer có giá trị 1 cho cột CustomerId và trong cột bảng dbo.Orders, CustomerId có giá trị 2 Các giá trị không khớp với nhau. Đó là lý do chúng tôi nhận được lỗi ở trên.

Giải pháp:

1) Sửa dữ liệu trong bảng thứ hai (dbo.Orders) Chúng tôi có thể sửa dữ liệu trong bảng thứ hai và cập nhật giá trị cột CustomerId. Sau khi chúng tôi có dữ liệu chính xác khớp với Bảng chính của mình (Dbo.Customer.CustomerId), nó sẽ cho phép chúng tôi tạo Ràng buộc khóa ngoại mà không gặp bất kỳ sự cố nào.
2) Sử dụng Bảng thay thế với Nocheck (Bỏ qua dữ liệu hiện có ) Nếu bạn không quan tâm đến mối quan hệ của dữ liệu hiện có. Bạn có thể sử dụng With NoCheck với câu lệnh bảng thay đổi và nó sẽ bỏ qua việc kiểm tra để xác thực dữ liệu và tạo Ràng buộc khóa ngoại. Sau khi tạo Ràng buộc khóa ngoại, nó sẽ thực thi tính toàn vẹn cho bất kỳ bản ghi mới nào được chèn vào.
 Thay đổi bảng dbo.Đơn hàng có Nocheck Thêm ràng buộc Fk_CustomerId Tham khảo khóa ngoại (CustomerId) dbo.Customer (CustomerId)  
 
 
   
   
  Video Demo  
   


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Chia một phân vùng thành hai trong SQL Server (T-SQL)

  2. Cách đặt giá trị mặc định cho cột hiện có

  3. Thứ tự của các cột trong chỉ mục quan trọng như thế nào?

  4. Kiểm tra xem một đối tượng có phải là khóa chính với OBJECTPROPERTY () trong SQL Server hay không

  5. Chuyển đổi số tháng thành tên tháng trong SQL Server (T-SQL)