ホームページ > データベース > mysql チュートリアル > MySQL CHECK 制約が 8.0.16 より前のバージョンで失敗するのはなぜですか?

MySQL CHECK 制約が 8.0.16 より前のバージョンで失敗するのはなぜですか?

Patricia Arquette
リリース: 2025-01-10 10:43:43
オリジナル
313 人が閲覧しました

Why Do MySQL CHECK Constraints Fail in Versions Before 8.0.16?

MySQL CHECK 制約の失敗問題

データベーステーブルを定義するときは、データの整合性を確保するために制約を追加することが重要です。 CHECK 制約を使用すると、特定の列の値が満たさなければならない条件を指定できます。ただし、MySQL 8.0.15 以前では、特殊なケースとして CHECK 制約は強制されません。

例:

<code class="language-sql">CREATE TABLE Customer (
  SD integer CHECK (SD > 0),
  Last_Name varchar (30),
  First_Name varchar(30)
);</code>
ログイン後にコピー

このテーブルを作成した後、負の SD 値を持つ行を挿入してみます:

<code class="language-sql">INSERT INTO Customer values ('-2', 'abc', 'zz');</code>
ログイン後にコピー

MySQL は、挿入された値が指定された CHECK 制約に違反している場合でも、エラーを報告しません。これは、MySQL リファレンス マニュアルによると次のとおりです。

<code>CHECK子句会被解析,但所有存储引擎都会忽略它。</code>
ログイン後にコピー

解決策:

この問題を解決するには、次のいずれかを実行できます:

  • MySQL 8.0.16 以降にアップグレードします: このバージョンでは、CHECK 制約のサポートが開始されます。詳細については、MySQL のドキュメントを参照してください。
  • トリガーの実装: トリガーを使用して、ストレージ エンジンが無視する制約を強制できます。以下に示すように、挿入前に SD 値をチェックするトリガーを作成すると、制約を効果的に強制できます。
<code class="language-sql">mysql> delimiter //
mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer 
    -> FOR EACH ROW 
    -> BEGIN 
    -> IF NEW.SD <=0 THEN SET NEW.SD=0; 
    -> END IF; 
    -> END
    -> //
mysql> delimiter ;</code>
ログイン後にコピー
上記のトリガーの例では、負の数値の SD 値が 0 に設定されていることに注意してください。実際のニーズに応じてトリガー ロジックを変更できます。

以上がMySQL CHECK 制約が 8.0.16 より前のバージョンで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート