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

Ràng buộc khóa ngoài hai chiều

"Tôi tin rằng điều này là không thể. Bạn không thể tạo Bản ghi địa chỉ cho đến khi bạn biết ID của người đó và bạn không thể chèn bản ghi người đó cho đến khi bạn biết một AddressId cho trường PrimaryAddressId."

Về mặt nó, tuyên bố đó có vẻ hấp dẫn. Tuy nhiên, nó khá là lạc hậu.

Đây là một dạng vấn đề rất phổ biến mà các nhà cung cấp SQL DBMS đã cố gắng tấn công có lẽ trong nhiều thập kỷ.

Điều quan trọng là tất cả việc kiểm tra ràng buộc phải được "hoãn lại" cho đến khi cả hai lần chèn được thực hiện. Điều đó có thể đạt được dưới các hình thức khác nhau. Các giao dịch cơ sở dữ liệu có thể cung cấp khả năng thực hiện điều gì đó như "BẬT kiểm tra ràng buộc hoãn lại SET", và bạn đã hoàn tất (thực tế không phải như vậy trong ví dụ cụ thể này, bạn có thể phải làm rất khó khăn với thiết kế của mình theo thứ tự để có thể XÁC ĐỊNH hai ràng buộc FK, bởi vì một trong số chúng đơn giản KHÔNG PHẢI LÀ FK 'đúng' theo nghĩa SQL!).

Các giải pháp dựa trên trình kích hoạt như được mô tả ở đây về cơ bản đạt được hiệu quả tương tự, nhưng những giải pháp đó có liên quan đến tất cả các vấn đề bảo trì tồn tại với tính toàn vẹn do ứng dụng thực thi.

Trong tác phẩm của mình, Chris Date &Hugh Darwen mô tả giải pháp thực sự cho vấn đề là gì:nhiều nhiệm vụ. Về cơ bản, đó là khả năng soạn một số câu lệnh cập nhật riêng biệt và để DBMS hoạt động dựa trên nó như thể đó là một câu lệnh duy nhất. Việc triển khai khái niệm đó có tồn tại, nhưng bạn sẽ không tìm thấy bất kỳ cách nào nói về SQL.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sự khác biệt giữa varchar và nvarchar là gì?

  2. Đảo ngược các thay đổi từ nhật ký giao dịch trong SQL Server 2008 R2?

  3. Tại sao newid () hiện thực hóa ở cuối truy vấn?

  4. PHP 5.5.0 w / Microsoft SQL Server 2008 R2 - Không có sqlsrv_connect ()?

  5. Xác định mối quan hệ một-một trong SQL Server