मेरे पास एक ट्रिगर है जिसे केवल तभी डालने की अनुमति देनी चाहिए जब 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;
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 में अपेक्षित रूप से काम करता है:
संबंधित सवाल
नए सवाल
mysql
MySQL एक फ्री, ओपन सोर्स रिलेशनल डेटाबेस मैनेजमेंट सिस्टम (RDBMS) है जो स्ट्रक्चर्ड क्वेरी लैंग्वेज (SQL) का उपयोग करता है। इस टैग को अन्य DBs जैसे SQL Server, SQLite आदि के लिए उपयोग न करें। वे विभिन्न DB हैं जो सभी डेटा का प्रबंधन करने के लिए SQL की अपनी बोलियों का उपयोग करते हैं।