MySQL8.0.16から待望のCHECK属性が入ったため、実際に動作を確かめてみました。
CREATE TABLE user ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, `user_id` varchar(20) CHARACTER SET ascii NOT NULL, `name` varchar(20) NOT NULL, `status` varchar(15) NOT NULL, `create_time` DATETIME NOT NULL, INDEX (`name`), PRIMARY KEY (`id`), UNIQUE (`user_id`), CHECK(`user_id` REGEXP '^[\-0-9A-Z_a-z]{4,}$'), CHECK(`name` != ''), CHECK(`status` != '') );
不正な文字列をINSERTしようとすると
ERROR 3819 (HY000): Check constraint 'user_chk_1' is violated.
と弾かれます。よさそう
CHARACTER SET asciiには罠があって、sql_modeをどんなに上げてもASCII範囲外(0x80など)がErrorではなくWarningで入れられてしまいます。やはりCHECK属性がいいですね。
どのくらい時間がかかるのか気になって、以下のテーブル定義で15文字のbodyを10000回挿入するテストを行ってみました。
CREATE TABLE post ( `id` bigint UNSIGNED NOT NULL AUTO_INCREMENT, `author_id` bigint UNSIGNED NOT NULL, `body` varchar(300) NOT NULL, `post_time` DATETIME NOT NULL, INDEX (`author_id`), PRIMARY KEY (`id`), CHECK(`body` != '') );
CHECK属性あり: 106.94秒 なし: 106.49秒
なぜか時間がかかりすぎて困惑ですが、同条件では大して変わらないことが確認できました。