Vì vậy, những gì bạn làm gì để thực thi quy tắc chỉ không thể hủy hồ sơ cho bất kỳ hoán vị đã cho LOC_ID, DATE, TIME? Chúng ta có thể làm điều này với một chỉ số duy nhất dựa trên chức năng.
Đây là những gì chúng tôi muốn tránh:
SQL> select * from t34
2/
PK LOC_ID SOMEDATE SOMETIM CAN
---------- ---------- ---------- ------- ---
1 1 01/01/2010 10:00AM YES
2 1 01/01/2010 10:00AM YES
3 1 01/01/2010 10:00AM
SQL> insert into t34
2 values (4 , 1 , to_date('01/01/2010','DD/MM/YYYY') , '10:00AM', null)
3/
1 row created.
SQL>
Hãy xây dựng một chỉ số để thực thi các quy tắc
SQL> rollback
2/
Rollback complete.
SQL> create unique index t34_uidx
2 on t34 (loc_id, somedate, some_time, nvl2(cancelled, pk, null))
3/
Index created.
SQL>
Các NVL2()
chức năng là một dạng đặc biệt của CASE mà trả về số thứ hai nếu đối số đầu tiên là NOT NULL nếu không thì thứ ba. Chỉ mục sử dụng PK col làm đối số thứ hai vì nó là khóa chính và do đó duy nhất. Vì vậy, các chỉ số cho phép giá trị nhân bản của HỦY BỎ trừ khi họ là null:
SQL> insert into t34
2 values (4 , 1 , to_date('01/01/2010','DD/MM/YYYY') , '10:00AM', null)
3/
insert into t34 values (4 , 1 , to_date('01/01/2010','DD/MM/YYYY') , '10:00AM', null)
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T34_UIDX) violated
SQL>
dụ của bạn dữ liệu không có cơ sở để từ chối hàng với PK = 4 khi nó cũng không từ chối một với PK = 2. –
@ Jonathan Leffler - Đánh tôi với nó. Có cùng một câu hỏi. – Thomas
Có, PK = 2 là OK. Hủy bỏ có thể có bất kỳ giá trị nhưng không null lặp lại hai lần cho cùng một locid, ngày tháng và thời gian. –