मेरे पास एक ट्रिगर है जिसे केवल तभी डालने की अनुमति देनी चाहिए जब REGEXP अभिव्यक्ति का मूल्यांकन सही हो। हालांकि, अभिव्यक्ति हमेशा सत्य का मूल्यांकन करती प्रतीत होती है।

यहां तक ​​​​कि अगर मैं यादृच्छिक वर्ण सम्मिलित करता हूं, जिनकी अभिव्यक्ति में कहीं भी अनुमति नहीं है, एक पंक्ति डाली जाती है।

रेगेक्स एक्सप्रेशन ऑनलाइन रेगेक्स चेकर्स पर काम करता है। लेकिन MySQL ट्रिगर का आह्वान करते समय कभी असफल नहीं होगा।

शुरू

-- find out what is the labelType based on the labelID
SET @labelType = ( SELECT labelTypeID 
                   FROM customer.label
                   WHERE labelID = NEW.labelID);

IF @labelType = 2 THEN -- 2 = date format in YYYY-MM-DD (ie: 2019-05-05)
    IF NEW.labelValue NOT REGEXP '[12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])' THEN
        SET @err_msg = CONCAT(NEW.labelValue, ' Invalid date format. Please make sure it conforms to YYYY-MM-DD.');

        SET @err_msg = left(@err_msg, 128);
        SIGNAL SQLSTATE '41000'
        SET MESSAGE_TEXT = @err_msg;
    END IF;
0
user10176607 24 जुलाई 2019, 19:18

1 उत्तर

सबसे बढ़िया उत्तर

8+ से पहले के MySQL के संस्करणों में REGEXP ऑपरेटर एक अंक का प्रतिनिधित्व करने के रूप में \d का समर्थन नहीं करता है। इसके बजाय, आपको [0-9] का उपयोग करना चाहिए:

IF NEW.labelValue NOT REGEXP '[12][0-9]{3}-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])'
THEN
    SET @err_msg = CONCAT(NEW.labelValue, ' Invalid date format. Please make sure it conforms to YYYYMMDD.');

यहाँ एक डेमो दिखा रहा है कि उपरोक्त रेगेक्स वास्तव में MySQL 5.7 में अपेक्षित रूप से काम करता है:

डेमो

0
Tim Biegeleisen 24 जुलाई 2019, 19:23