जैसा कि हम जानते हैं कि MySQL रेफरेंशियल इंटीग्रिटी के लिए फॉरेन की सपोर्ट करता है लेकिन CHECK कंस्ट्रेन्ट सपोर्ट नहीं करता। लेकिन हम ट्रिगर्स का उपयोग करके उनका अनुकरण कर सकते हैं। इसे नीचे दिए गए उदाहरण से समझा जा सकता है:
उदाहरण
मान लीजिए हमारे पास 'car' नाम की एक टेबल है जिसमें फिक्स्ड सिंटैक्स रजिस्ट्रेशन नंबर हो सकता है जैसे दो अक्षर, एक डैश, तीन अंक, एक डैश, दो अक्षर:
mysql> CREATE TABLE car2 (number CHAR(9));
Query OK, 0 rows affected (0.32 sec)
mysql> INSERT INTO car2 VALUES('AB-235-YZ');
Query OK, 1 row affected (0.10 sec)
उपरोक्त मान वैध है लेकिन अगले क्वेरी में हम जो मान डालने जा रहे हैं उसका क्या?
mysql> INSERT INTO car2 VALUES('AB-2X5-YZ');
Query OK, 1 row affected (0.04 sec)उपरोक्त मान वैध नहीं है क्योंकि इसमें अंकों के बीच एक कैरेक्टर है जो हमारे द्वारा उपयोग किए जा रहे फिक्स्ड सिंटैक्स के विरुद्ध है।
CHECK CONSTRAINT का अनुकरण करने के लिए GENERATED COLUMN का उपयोग (इंसर्ट और अपडेट के लिए):
mysql> ALTER TABLE car2 ADD COLUMN number_validate CHAR(0) AS (CASE WHEN number RLIKE '^[[:alpha:]]{2}-[[:digit:]]{3}-[[:alpha:]]{2}$' THEN '' END) VIRTUAL NOT NULL;
Query OK, 0 rows affected (0.53 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> DESCRIBE car2;
+-----------------+---------+------+-----+---------+-------------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------+------+-----+---------+-------------------+
| number | char(9) | YES | | NULL | |
| number_validate | char(0) | NO | | NULL | VIRTUAL GENERATED |
+-----------------+---------+------+-----+---------+-------------------+
2 rows in set (0.00 sec)
mysql> INSERT INTO car2 (number) VALUES('AB-235-YZ');
Query OK, 1 row affected (0.09 sec)उपरोक्त क्वेरी वैध नंबर डालती है इसलिए यह स्वीकार हो जाती है। लेकिन नीचे दी गई क्वेरी वैध नंबर डालने के साथ-साथ अपडेट भी नहीं कर रही है।
mysql> INSERT INTO car2 (number) VALUES('AB-2X5-YZ');
ERROR 1048 (23000): Column 'number_validate' cannot be null
mysql> UPDATE car2 SET number='AB-2X5-YZ';
ERROR 1048 (23000): Column 'number_validate' cannot be nullव्याख्या: वर्चुअल जनरेटेड कॉलम `number_validate` शर्त पूरी होने पर खाली स्ट्रिंग ('') देता है, अन्यथा NULL। NOT NULL कंस्ट्रेन्ट NULL को अस्वीकार करता है, जिससे अमान्य डेटा ब्लॉक हो जाता है। यह ट्रिगर्स से सरल है और MySQL 5.7+ में काम करता है।