MySQL 8.0.16 の CHECK 制約について検証してみた

こんにちは。サイオステクノロジー OSS サポート担当 Y です。

今回は MySQL 8.0.16 で実装された CHECK 制約について検証してみました。(※以下の内容は MySQL 8.0.15/MySQL 8.0.16 にて検証しています。)

■はじめに

MySQL 8.0 では、様々な新機能が追加されています。

普段の業務では PostgreSQL を扱うことが多いのですが、最近 MySQL に CHECK 制約が実装されたという話を聞いたので、今回はこの CHECK 制約について検証してみました。

■MySQL 8.0.15 (CHECK 制約未実装) にて検証

最初に、MySQL 8.0.15 (CHECK 制約未実装のバージョン) で検証してみます。

以下の様に CHECK 制約を指定してテーブルを作成してみます。(※t1.a に対して “0 < a AND a <= 3" という CHEKC 制約を指定しています。)

すると、エラーにはならずにテーブルを作成することができました。 しかし、SHOW CREATE TABLE コマンドにてテーブルの定義を確認してみると、CHECK 制約の設定は反映されていない様に見えます。

このテーブル t1 に対して、実際に値を INSERT してみます。 まずは、CHECK 制約に指定した条件 "0 < a AND a <= 3" の範囲内の値を INSERT してみます。

特に問題なく実行できました。これは想定通りの動作です。 次に、CHECK 制約に指定した条件 "0 < a AND a <= 3" の範囲外の値を INSERT してみます。

すると、テーブル定義時の DDL 文に指定している CHECK 制約の範囲外の値でもテーブルに INSERT することができました。 これが、MySQL 8.0.15 までの仕様動作のようです。

■MySQL 8.0.16 (CHECK 制約実装) にて検証

次に、MySQL 8.0.16 で検証してみます。

先程と同じ様に、CHECK 制約を指定してテーブルを作成します。(※t1.a に対して “0 < a AND a <= 3" という CHEKC 制約を指定しています。)

テーブル作成後、SHOW CREATE TABLE コマンドにてテーブルの定義を確認してみると、CHECK 制約の設定 "CONSTRAINT t1_chk_1 CHECK (((0 < a) and (a <= 3)))" が反映されています。

先程と同じ様に、このテーブル t1 に対して実際に値を INSERT してみます。 まずは、CHECK 制約に指定した条件 "0 < a AND a <= 3" の範囲内の値を INSERT してみます。

特に問題なく INSERT できました。 次に、CHECK 制約に指定した条件 "0 < a AND a <= 3" の範囲外の値を INSERT してみます。

すると、先程とは異なり "Check constraint 't1_chk_1' is violated." というエラーが出力されました。 実際に t1 のレコードを確認すると、エラーになった "0" や "4" の値は INSERT されていないことが確認できます。 上記の通り、MySQL 8.0.16 では CHECK 制約が実装されていることが確認できました。

■最後に

今回は MySQL 8.0.16 で実装された CHECK 制約について検証してみました。

MySQL 8.0 では様々な新機能が実装されているので、次回も MySQL 8.0 の新機能の検証を実施してみようかと思います。

>> 雑誌等の執筆依頼を受付しております。
   ご希望の方はお気軽にお問い合わせください!

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメント投稿

メールアドレスは表示されません。


*