কম্পিউটার টিউটোরিয়াল

MySQL GENERATED COLUMN ব্যবহার করে CHECK CONSTRAINT অনুকরণ করা

MySQL CHECK কনস্ট্রেইন্ট সরাসরি সমর্থন করে না (৮.০.১৬ এর আগে), কিন্তু GENERATED COLUMN ব্যবহার করে এটি অনুকরণ করা যায়।

উদাহরণ: গাড়ির নম্বার ফরম্যাট ভ্যালিডেশন

ফরম্যাট: AB-235-YZ (দুই অক্ষর-ড্যাশ-তিন ডিজিট-ড্যাশ-দুই অক্ষর)।

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)  -- কোনো এরর নেই!

GENERATED COLUMN যোগ করা (VIRTUAL, NOT NULL)

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)

mysql> DESCRIBE car2;
+-----------------+---------+------+-----+---------+-------------------+
| Field           | Type    | Null | Key | Default | Extra             |
+-----------------+---------+------+-----+---------+-------------------+
| number          | char(9) | YES  |     | NULL    |                   |
| number_validate | char(0) | NO   |     | NULL    | VIRTUAL GENERATED |
+-----------------+---------+------+-----+---------+-------------------+

পরীক্ষা

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 কলামটি VIRTUAL GENERATED এবং NOT NULL। যদি রেজেক্স মিল না খায়, তবে CASE এক্সপ্রেশন NULL রিটার্ন করে, যা NOT NULL লঙ্ঘন করে এবং এরর ফেলে।

  1. MySQL টেবিলে কোন কলাম আছে কিনা চেক করার উপায়

  2. MySQL-এ টেবিলে CHECK CONSTRAINT যোগ করা

  3. MySQL-এ ALTER TABLE দিয়ে কলাম যোগ করা (DEFAULT ভ্যালু সহ)

  4. MySQL-এ টেবিলের সকল কলাম মুছে দিন (DROP TABLE)