MySQL8.0.16のCHECK属性をつかってみた

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秒

なぜか時間がかかりすぎて困惑ですが、同条件では大して変わらないことが確認できました。

カテゴリー: コンピュータ パーマリンク

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中