Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

ट्रिगर्स का उपयोग करके CHECK CONSTRAINT का अनुकरण कैसे करें?


जैसा कि हम जानते हैं कि MySQL रेफरेंशियल इंटीग्रिटी के लिए फॉरेन की सपोर्ट करता है लेकिन CHECK कंस्ट्रेन्ट सपोर्ट नहीं करता। लेकिन हम ट्रिगर्स का उपयोग करके उनका अनुकरण कर सकते हैं। इसे नीचे दिए गए उदाहरण से समझा जा सकता है:

उदाहरण

मान लीजिए हमारे पास 'car' नाम की एक टेबल है जिसमें फिक्स्ड सिंटैक्स रजिस्ट्रेशन नंबर हो सकता है जैसे दो अक्षर, एक डैश, तीन अंक, एक डैश, दो अक्षर:

mysql> CREATE TABLE car (number CHAR(9));
Query OK, 0 rows affected (0.32 sec)
mysql> INSERT INTO car VALUES('AB-235-YZ');
Query OK, 1 row affected (0.10 sec)

उपरोक्त मान वैध है लेकिन अगले क्वेरी में हम जो मान डालने जा रहे हैं उसका क्या?

mysql> INSERT INTO car VALUES('AB-2X5-YZ');
Query OK, 1 row affected (0.04 sec)

उपरोक्त मान वैध नहीं है क्योंकि इसमें अंकों के बीच एक कैरेक्टर है जो हमारे द्वारा उपयोग किए जा रहे फिक्स्ड सिंटैक्स के विरुद्ध है।

मान डालने के लिए CHECK CONSTRAINT का अनुकरण करने के लिए BEFORE INSERT ट्रिगर बनाना:

अब, हम निम्नलिखित ट्रिगर बना सकते हैं ताकि ऐसे इंसर्शन को रोका जा सके:

mysql> DELIMITER //
mysql> CREATE TRIGGER car_insert_value BEFORE INSERT ON car
-> FOR EACH ROW
-> BEGIN
-> IF NEW.number NOT RLIKE '^[[:alpha:]]{2}-[[:digit:]]{3}-[[:alpha:]]{2}$'
-> THEN
-> SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Not a valid Number';
-> END IF;
-> END //
Query OK, 0 rows affected (0.15 sec)
mysql> DELIMITER ;
mysql> DELETE FROM car;
Query OK, 2 rows affected (0.06 sec)

अब, जब हम गलत नंबर डालने की कोशिश करेंगे, तो उपरोक्त ट्रिगर हमें रोकेगा और एरर फेंकेगा:

mysql> INSERT INTO car VALUES('AB-2X5-YZ');
ERROR 1644 (45000): Not a Valid Number

लेकिन, हम वैध मान डाल सकते हैं:

mysql> INSERT INTO car VALUES('AB-235-YZ');
Query OK, 1 row affected (0.04 sec)

मान अपडेट करने के लिए CHECK CONSTRAINT का अनुकरण करने के लिए BEFORE UPDATE ट्रिगर बनाना:

अब, मान लीजिए अगर हम टेबल को गलत मान से अपडेट करने की कोशिश करते हैं तो MySQL हमें रोकने वाला नहीं है:

mysql> UPDATE car SET number='AB-2X5-YZ';
Query OK, 1 row affected (0.04 sec)
Rows matched: 1 Changed: 1 Warnings: 0

उपरोक्त क्वेरी ने टेबल 'car' में गलत मान अपडेट कर दिया। निम्नलिखित क्वेरी में हम BEFORE UPDATE ट्रिगर बनाने जा रहे हैं जो हमें टेबल में गलत डेटा अपडेट करने से रोकेगा:

mysql> DELIMITER //
mysql> CREATE TRIGGER car_update_value BEFORE UPDATE ON car
-> FOR EACH ROW
-> BEGIN
-> IF NEW.number NOT RLIKE '^[[:alpha:]]{2}-[[:digit:]]{3}-[[:alpha:]]{2}$'
-> THEN
-> SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Not a valid number';
-> END IF;
-> END //
Query OK, 0 rows affected (0.11 sec)
mysql> DELIMITER ;
mysql> UPDATE car SET number='AB-2X5-YZ';
ERROR 1644 (45000): Not a valid number

नोट: MySQL 8.0.16+ में नेटिव CHECK कंस्ट्रेन्ट सपोर्ट करता है। ट्रिगर विधि पुराने वर्जन के लिए है।

  1. - VIEWS का उपयोग करके CHECK CONSTRAINT का अनुकरण कैसे करें?

    हम जानते हैं कि MySQL संदर्भीय अखंडता के लिए विदेशी कुंजी का समर्थन करता है लेकिन यह CHECK CONSTRAINT का समर्थन नहीं करता। लेकिन हम ट्रिगर का उपयोग करके उनका अनुकरण कर सकते हैं। इसे नीचे दिए गए उदाहरण से समझा जा सकता है: उदाहरण मान लीजिए हमारे पास car1 नामक एक तालिका है जिसमें निश्चित वाक्यविन्यास प

  1. - MySQL में टेबल पर CHECK कंस्ट्रेंट कैसे जोड़ें?

    MySQL 8.0.16+ CHECK कंस्ट्रेंट का पूर्ण समर्थन करता है। पुराने संस्करण इसे पार्स करते हैं लेकिन लागू नहीं करते। सिंटैक्स CREATE TABLE table_name ( column1 datatype, column2 datatype, ... CHECK (condition) ); उदाहरण: आयु सीमा कंस्ट्रेंट ); Query OK, 0 rows affected (0.55 sec) नामि

  1. - MySQL संस्करण कैसे जांचें

    आइए समझते हैं कि उपयोगकर्ता वर्तमान में जो MySQL संस्करण चला रहा है, उसकी जांच कैसे करें: कंसोल पर क्वेरी दर्ज करने से पहले, यह सुनिश्चित करना महत्वपूर्ण है कि उपयोगकर्ता सर्वर से जुड़ा हुआ है। MySQL संस्करण जांचें नीचे दी गई क्वेरी सर्वर के संस्करण संख्या और वर्तमान तारीख देगी। mysql> SELECT