Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

एक अद्वितीय बाधा केवल तभी सेट करें जब कोई फ़ील्ड रिक्त हो

MySQL फंक्शनल को सपोर्ट करता है। मुख्य भाग 8.0.13 . के बाद से ।

  • यदि आपका संस्करण पर्याप्त रूप से नवीनतम है तो आप अपनी अनुक्रमणिका को इस प्रकार परिभाषित कर सकते हैं:

    UNIQUE(`user_id`, `test_id`, (IFNULL(`completed_date`, -1)))
    

    (dbfiddle.uk पर डेमो )

    ध्यान दें कि उपरोक्त सूचकांक पूर्ण निष्पादन के लिए डुप्लिकेट तिथियों को भी रोकेगा। यदि वे मान्य होने चाहिए तो थोड़ा संशोधित सूचकांक काम करेगा:

    UNIQUE(`user_id`, `test_id`, (
        CASE WHEN `completed_date` IS NOT NULL
        THEN NULL
        ELSE 0
    END))
    

    (dbfiddle.uk पर डेमो )

    हालांकि तब यह थोड़ा गंदा लगने लगता है;)

  • यदि आपके पास कम से कम संस्करण 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`)
    );
    

    (dbfiddle.uk पर डेमो )

  • अगर आप 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 को बराबर नहीं माना जाता है।

    (dbfiddle.uk पर डेमो )




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. सिम्फनी 2 के साथ सिद्धांत का उपयोग करके कई-से-अनेक संबंधों पर प्रश्न

  2. SQL सिंटैक्स त्रुटि - त्रुटि नहीं ढूँढ सकता

  3. कोलाज के अवैध मिश्रण को कैसे हल करें (latin1_general_ci,IMPLICIT) त्रुटि

  4. MySQL INSERT क्वेरी को कई बार चलाएँ (एकाधिक तालिकाओं में मान डालें)

  5. सभी तालिकाओं के माध्यम से लूप करें और एक कॉलम का नाम बदलें