MySQLでGENERATED COLUMNを使ってCHECK制約をエミュレートする方法
MySQLは参照整合性を確保するための外部キー(FOREIGN KEY)をサポートしていますが、CHECK制約はサポートしていません。ただし、トリガーやGENERATED COLUMN(生成カラム)を活用することで、CHECK制約と同等の動作を実現できます。本記事では、GENERATED COLUMNを使った方法を具体例とともに解説します。
例:登録番号の形式を検証する
「car」というテーブルがあり、登録番号は「英字2文字-数字3桁-英字2文字」という固定形式に従うものとします。
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でINSERT・UPDATE時の値を検証する
そこで、VIRTUAL GENERATEDカラムを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)
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仕組みのポイント
このテクニックの鍵は、VIRTUAL GENERATEDカラム「number_validate」をNOT NULL制約付きで定義している点にあります。値が正規表現パターンにマッチした場合のみ空文字列が返され、マッチしない場合はNULLが返されるため、NOT NULL制約違反としてエラーが発生します。これにより、INSERTとUPDATEの両方の操作に対して、CHECK制約と同等のデータ検証を実現できるのです。
-
MySQLのALTER TABLEでカラムを追加する方法!デフォルト値の設定手順もわかりやすく解説
MySQLでは、ALTER TABLE文を使うことで、既存のテーブルに後から新しいカラムを追加できます。この記事では、基本的な構文から、実際にテーブルを作成してカラムを追加し、デフォルト値がどのように機能するかまでを順番に解説します。ALTER TABLEでカラムを追加する基本構文MySQLでalter文を使ってカラムを追加する場合の基本構文は以下の通りです。ALTER TABLE テーブル名 ADD COLUMN カラム名 データ型 DEFAULT デフォルト値;このように、ADD COLUMNの後に追加したいカラム名とデータ型を指定します。さらにDEFAULT句を付けることで、値が指定され
-
MySQLでテーブルのすべての列を削除する方法|DROP TABLEコマンドの使い方を解説
MySQLでテーブル内の全カラムを削除するには?MySQLでは、テーブルに存在するすべてのカラム(列)を1つずつ削除していくことはできません。すべての列を削除したい場合、つまりテーブル自体をデータベースから取り除きたい場合は、DROP TABLE コマンドを使用します。DROP TABLEの基本構文DROP TABLE テーブル名;このコマンドを実行すると、指定したテーブルとその中のすべてのデータ・構造が完全に削除されます。なお、この操作は元に戻せないため、実行前には必ず内容を確認してください。実際に試してみよう:サンプルテーブルの作成まずは動作を確認するために、以下のようにサンプルテーブルを