2012-04-25 40 views
16

Tôi có một tình huống mà tôi cần phải thực thi ràng buộc duy nhất trên cột [thuộc tính] tùy thuộc vào giá trị cột khác.Ràng buộc duy nhất có điều kiện trong oracle db

Vì vậy, ví dụ, tôi có một bảng như bảng (ID, EID, Tên, isDeleted)

isDeleted chỉ có thể có một giá trị null hoặc 'y' (hoạt động hoặc bị xóa), và tôi muốn tạo ra một ràng buộc duy nhất trên EID, ISDeleted chỉ khi ISDeleted = null, vì tôi không quan tâm nếu có nhiều bản ghi đã xóa với cùng một id. Xin lưu ý rằng, EID có thể có giá trị null.

Tôi đang sử dụng Oracle DB cho việc này.

Trả lời

22

Bạn không thể tạo ràng buộc. Nhưng bạn có thể tạo chỉ mục dựa trên hàm duy nhất. Điều này lợi dụng thực tế là Oracle không chỉ số NULL giá trị-- bất kỳ hàng nào trong đó isDeletedNOT NULL sẽ không được đưa vào chỉ mục để ràng buộc duy nhất sẽ không áp dụng cho chúng.

CREATE UNIQUE INDEX one_not_deleted 
    ON table_name((CASE WHEN isDeleted IS NULL 
         THEN eid 
         ELSE null 
         END)); 
+0

'Điều gì khác' sẽ làm gì? Nó sẽ chèn một giá trị null HOẶC cho phép chèn bản ghi trùng lặp? – D3V

+0

@SantoshPingale - Vì chỉ mục Oracle không chỉ mục giá trị NULL, 'ELSE NULL' sẽ loại trừ các hàng đó khỏi chỉ mục sẽ cho phép trùng lặp. –

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