MySQL फंक्शनल को सपोर्ट करता है। मुख्य भाग 8.0.13 . के बाद से ।
-
यदि आपका संस्करण पर्याप्त रूप से नवीनतम है तो आप अपनी अनुक्रमणिका को इस प्रकार परिभाषित कर सकते हैं:
UNIQUE(`user_id`, `test_id`, (IFNULL(`completed_date`, -1)))
ध्यान दें कि उपरोक्त सूचकांक पूर्ण निष्पादन के लिए डुप्लिकेट तिथियों को भी रोकेगा। यदि वे मान्य होने चाहिए तो थोड़ा संशोधित सूचकांक काम करेगा:
UNIQUE(`user_id`, `test_id`, ( CASE WHEN `completed_date` IS NOT NULL THEN NULL ELSE 0 END))
हालांकि तब यह थोड़ा गंदा लगने लगता है;)
-
यदि आपके पास कम से कम संस्करण 5.7 . है आप एक (वर्चुअल) जेनरेटेड कॉलम का उपयोग कर सकते हैं समाधान के रूप में:
CREATE TABLE `executed_tests` ( `id` INTEGER AUTO_INCREMENT NOT NULL, `user_id` INTEGER NOT NULL, `test_id` INTEGER NOT NULL, `start_date` DATE NOT NULL, `completed_date` DATE, `_helper` CHAR(11) AS (IFNULL(`completed_date`, -1)), PRIMARY KEY (`id`), UNIQUE(`user_id`, `test_id`, `_helper`) );
-
अगर आप 5.6 . पर अटके हुए हैं फिर एक नियमित (गैर-आभासी) कॉलम का संयोजन और थोड़ा संशोधित
INSERT
बयान काम करेंगे:CREATE TABLE `executed_tests` ( `id` INTEGER AUTO_INCREMENT NOT NULL, `user_id` INTEGER NOT NULL, `test_id` INTEGER NOT NULL, `start_date` DATE NOT NULL, `completed_date` DATE, `is_open` BOOLEAN, PRIMARY KEY (`id`), UNIQUE(`user_id`, `test_id`, `is_open`) );
इस मामले में आप सेट करेंगे
is_open
करने के लिएtrue
अपूर्ण निष्पादन के लिए औरNULL
. के लिए पूरा होने के बाद, इस तथ्य का उपयोग करते हुए कि दोNULL
s को बराबर नहीं माना जाता है।