MySQLはバージョン8.
今回はMySQL 8.
なお、
CHECK制約
CHECK制約は、
実際にテーブルを作成して動作を確認してみましょう。11より小さい数かどうか検証するCHECK制約をつけたテーブルを作成し、
mysql> CREATE TABLE t1(num TINYINT UNSIGNED CHECK(num < 11)); Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO t1(num) VALUES (10); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO t1(num) VALUES (11); ERROR 3819 (HY000): Check constraint 't1_chk_1' is violated.
11の値はCHECK制約違反でエラーとなりました。今度は、
mysql> SELECT * FROM t1; +------+ | num | +------+ | 10 | +------+ 1 row in set (0.00 sec) mysql> UPDATE t1 SET num = 11 WHERE num = 10; ERROR 3819 (HY000): Check constraint 't1_chk_1' is violated.
更新も同様にCHECK制約違反でエラーとなりました。
CHECK制約の作成
前節で動きを確認できたところで、CHECK(式の評価)
で定義することができます。CHECK制約は、
カラム制約は、<テーブル名>_chk_<番号>
の形式で生成されます。
mysql> CREATE TABLE t1( -> num1 INT CHECK (num1 > 1), -> num2 INT CONSTRAINT num2_chk CHECK (num2 > 0), -> CHECK (num1 *2 < num2), -> CONSTRAINT t1_chk CHECK (num1 <> 0) -> ); Query OK, 0 rows affected (0.01 sec)
作成したCHECK制約の確認
作成したCHECK制約は、INFORMATION_
のCHECK_
テーブルから、
mysql> SELECT * FROM information_schema.check_constraints; +--------------------+-------------------+-----------------+-------------------------+ | CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | CHECK_CLAUSE | +--------------------+-------------------+-----------------+-------------------------+ | def | check_database | t1_chk_1 | (`num1` > 1) | | def | check_database | num2_chk | (`num2` > 0) | | def | check_database | t1_chk_2 | ((`num1` * 2) < `num2`) | | def | check_database | t1_chk | (`num1` <> 0) | +--------------------+-------------------+-----------------+-------------------------+ 4 rows in set (0.01 sec)
実際にCHECK制約を運用してCHECK制約違反が出た場合は、performance_
のevents_
系のテーブルのER_
のエラーカウントが計測されます。もし、
CHECK制約の制限
CHECK制約の利用にはいくつか制限があります。以下の内容に当てはまるものについては利用できません。
- AUTO_
INCREMENTを設定したカラム - 他のテーブルのカラムを参照してCHECK制約を定義する
- ストアドファンクション、
ストアドプロシージャの利用 - 変数
- サブクエリ
- 非決定性関数
(NOW()やCURRENT_ USER()等)
その他の詳細な条件については、
また、
mysql> insert into t1 values(0),(1),(2); Query OK, 3 rows affected (0.01 sec) mysql> ALTER TABLE t1 ADD CONSTRAINT CHECK(num > 0); ERROR 3819 (HY000): Check constraint 't1_chk_1' is violated.
まとめ
今回はCHECK制約について簡単に見ていきました。実際に利用する際には、
CHECK制約は正しい形でデータを入れるという面ではとても有用です。しかし、