2011-11-21 34 views
8

Tôi rất tò mò nếu tôi có thể dựa vào bất kỳ thứ tự cụ thể nào để xác thực các ràng buộc NOT NULL, FOREIGN KEY, UNIQUE, CHECK và các kích hoạt BEFORE.Chuẩn SQL có xác định thứ tự xác nhận ràng buộc và kích hoạt kích hoạt không?

Từ kinh nghiệm tôi biết rằng trước tiên, MySQL kiểm tra NOT NULL, sau đó khởi chạy kích hoạt BEFORE và sau đó kiểm tra các ràng buộc UNIQUE. Oracle kiểm tra NOT NULL sau khi kích hoạt BEFORE (Tôi tin rằng SQLServer làm như vậy, nhưng không nhớ). Liệu các tiêu chuẩn nói bất cứ điều gì về thứ tự hoặc nó hoàn toàn lên đến DB nhà cung cấp?

+0

Oracle không ** không ** kiểm tra NOT NULL cho đến sau khi trình kích hoạt 'trước'. Điều đó cho phép trình kích hoạt 'trước' thay đổi các giá trị sao cho chúng không còn null nữa. –

+0

@Shannon Mức độ nghiêm trọng: Vâng, xin lỗi, tôi đã suy nghĩ về mysql ... Cố định – a1ex07

+1

Bạn có thể tải xuống một [draft] (http://www.wiscorp.com/sql200n.zip) (Liên kết được lấy từ Wikipedia) của tiêu chuẩn gần đây và xem xét nó một mình (Tôi không thể tìm thấy bất kỳ định nghĩa nào) –

Trả lời

2

Hành vi cụ thể đó dường như là bug in MySQL và chỉ ảnh hưởng đến các kích hoạt BEFORE INSERT trong khi trình kích hoạt BEFORE UPDATE hoạt động chính xác.

Các standard (như liên kết trong bình luận câu hỏi) chắc chắn không đánh vần nó ra một cách rõ ràng, nhưng nó chắc chắn ngụ ý:

Đối với mỗi thay đổi trạng thái SCI, j trong TECi, các TRƯỚC gây nên kích hoạt bằng cách SCI, j được thực hiện trước khi bất kỳ sự kiện kích hoạt nào của chúng có hiệu lực. Khi các sự kiện kích hoạt đó có hiệu lực, bất kỳ kích hoạt SAU nào được kích hoạt bởi các thay đổi trạng thái của TECi được thực hiện.

Một lỗi NOT NULL nên là một phần của (ví dụ: sự kiện kích hoạt) INSERT hoặc UPDATE. Tiêu chuẩn không cần phải xác định điều này. Có hoàn toàn không có điểm nào để kiểm tra trước ràng buộc một tập hợp các thay đổi không phải là cuối cùng vì kích hoạt BEFORE của bạn có khả năng giải quyết cả lỗi giới thiệu các thay đổi mới.

TÓM TẮT: Nó thực sự không phải là nhà cung cấp DB vì kiểm tra ràng buộc sau khi kích hoạt trước là luôn luôn cần thiết.

Các vấn đề liên quan