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>
解決策:
この問題を解決するには、次のいずれかを実行できます:
<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>
以上がMySQL CHECK 制約が 8.0.16 より前のバージョンで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。