तो आप क्या क्या एक नियम है, जहां केवल रिकॉर्ड LOC_ID, तिथि, समय के किसी भी दिए गए क्रमपरिवर्तन के लिए रद्द नहीं किया जा सकता है लागू करने के लिए है? हम इसे फ़ंक्शन-आधारित अद्वितीय अनुक्रमणिका के साथ कर सकते हैं।
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>
के शासन लागू करने के लिए
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>
NVL2()
समारोह एक सूचकांक का निर्माण करते हैं है जो दूसरा तर्क है, तो रिटर्न मामले की एक विशेष रूप:
इसी को हम बचना चाहते है पहला तर्क न तो तीसरा है। सूचकांक दूसरे तर्क के रूप में पीके कोल का उपयोग करता है क्योंकि यह प्राथमिक कुंजी है और इसलिए अद्वितीय है। तो सूचकांक रद्द की डुप्लिकेट मानों की अनुमति देता है जब तक कि वे अशक्त हैं:
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>
आपका उदाहरण डेटा पीके = 4 के साथ पंक्ति को अस्वीकार करने का कोई आधार नहीं देता है जब यह पीके = 2. –
@ जोनाथन लेफ्लर के साथ किसी को भी अस्वीकार नहीं करता है - मुझे इसे मारो। वही सवाल था। – Thomas
हां, पीके = 2 ठीक है। रद्द किए गए किसी भी मूल्य का हो सकता है लेकिन एक ही स्थान, दिनांक और समय के लिए दो बार दोहराना नहीं। –