Mục đích của SET NULL trong các ràng buộc Xóa / Cập nhật Khóa ngoài là gì?


15

Tôi có lẽ là người hẹp hòi, nhưng nếu tôi tạo một ràng buộc khóa ngoại và một hàng được cập nhật hoặc xóa, tôi sẽ mất kết nối đó nếu cột của bảng con được đặt thành NULL.

Mục đích của việc cố ý giữ những hàng mồ côi này là gì?


Tôi đang tìm kiếm các trường hợp sử dụng và tôi không nghĩ chúng là cơ sở dữ liệu cụ thể (có thể sai ở đây)
Derek Downey

Tôi chưa bao giờ thấy một trường hợp sử dụng cho điều này hoặc là ...
a_horse_with_no_name

Câu trả lời:


13

set nullhữu ích hay không phụ thuộc vào nullý nghĩa của bạn trong bối cảnh cụ thể - với tất cả sự nhầm lẫn và ý kiến ​​xung quanh nullIMO, cách tiếp cận hợp lý là dành cho DBA

  1. Chọn (và tài liệu) ý nghĩa của nó đối với từng trường nullable
  2. Hãy chắc chắn rằng nó có nghĩa là một điều duy nhất

Với các quy tắc đó, hãy xem xét trường hợp sử dụng sau:

  • Bạn có một bảng 'cửa hàng' (ví dụ: cơ sở cá nhân)
  • Bạn có một bảng 'nhà bán lẻ' (ví dụ: chuỗi)
  • Bảng 'cửa hàng' có trường tra cứu đề cập đến khóa của 'nhà bán lẻ'
  • Bạn đã xác định nullđể đại diện cho một cửa hàng độc lập (nghĩa là một cửa hàng không phải là một phần của chuỗi)
  • Một 'nhà bán lẻ' đóng cửa các chi nhánh đến mức bạn coi các cửa hàng của mình là độc lập

Trong trường hợp này, một on delete set nullý nghĩa. Có nhiều cách khác để mô hình hóa các quy tắc kinh doanh này nhưng đây là cách đơn giản nhất và nếu nó phù hợp chính xác với sự thật mà bạn quan tâm trong thế giới thực, tôi đề nghị nó hoàn toàn ổn


Điểm hay với ý nghĩa nghiêm ngặt là null và với ví dụ của bạn, rõ ràng tại sao đây là một tính năng.
Derek Downey

1

Hầu hết các trường hợp sử dụng mà tôi có thể nghĩ chung thường có dạng "Chà, chúng tôi có thể làm điều gì đó khác biệt nhưng chúng tôi cảm thấy muốn làm điều này thay vào đó".

Xem xét một ownertrường cho một lỗi trong hệ thống theo dõi vấn đề tại một công ty. Nếu John thoát, chắc chắn tất cả các vấn đề của anh ta không nên bị xóa khi tài khoản của anh ta bị xóa. Thậm chí sau đó, một số cơ sở dữ liệu cho phép SET DEFAULTnhư một hành động (hoặc có một trình kích hoạt thực hiện cùng một nhiệm vụ) và để một Nobodynhân viên là chủ sở hữu mặc định của các vấn đề có thể là một lựa chọn. Hoặc chúng ta có thể có một disabledlĩnh vực cho John hơn là xóa hồ sơ của mình.


3
Trong trường hợp này, tôi sẽ tranh luận không cho phép xóa ( RESTRICT), nếu không có lý do nào khác để chỉ ra sự đổ lỗi cho một nhân viên cũ khi có sự cố xảy ra với nó!
Derek Downey
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.