137

まず、次のようなテーブルを作成しました

CREATE TABLE Customer (
  SD integer CHECK (SD > 0),
  Last_Name varchar (30),
  First_Name varchar(30)
);

次に、そのテーブルに値を挿入します

INSERT INTO Customer values ('-2','abc','zz');

MySQLはエラーを表示せず、値を受け入れました。

4

8 に答える 8

152

MySQL 8.0.16は、CHECK 制約をサポートする最初のバージョンです。

https://dev.mysql.com/doc/refman/8.0/en/create-table-check-constraints.htmlを読む

MySQL 8.0.15 以前を使用している場合、MySQL リファレンス マニュアルには次のように記載されています。

句は解析されますが、CHECKすべてのストレージ エンジンによって無視されます。

トリガーを試してみてください...

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 ;

それが役立つことを願っています。

于 2010-01-22T07:11:03.147 に答える
76

残念ながら、MySQL は SQL チェック制約をサポートしていません。互換性の理由から DDL クエリで定義できますが、無視されます。

簡単な代替手段があります

データの要件が満たされない場合に、エラーを引き起こすか、フィールドをデフォルト値に設定するトリガーをBEFORE INSERT作成できます。BEFORE UPDATE

BEFORE INSERTMySQL 5.5 以降の作業例

DELIMITER $$
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test`
FOR EACH ROW
BEGIN
    IF CHAR_LENGTH( NEW.ID ) < 4 THEN
        SIGNAL SQLSTATE '12345'
            SET MESSAGE_TEXT := 'check constraint on Test.ID failed';
    END IF;
END$$   
DELIMITER ;  

MySQL 5.5 より前では、未定義のプロシージャを呼び出すなど、エラーを発生させる必要がありました。

どちらの場合も、これにより暗黙的なトランザクション ロールバックが発生します。MySQL では、プロシージャおよびトリガー内で ROLLBACK ステートメント自体を使用することはできません。

トランザクションをロールバックしたくない場合 ( INSERT / UPDATE は、「チェック制約」が失敗した場合でもパスする必要があります。SET NEW.ID = NULLこれを使用して値を上書きできます。これにより、ID がフィールドのデフォルト値に設定されますが、ID には意味がありません。だけど

編集: 浮遊引用を削除しました。

:=オペレーターについて:

とは異なり=:=演算子が比較演算子として解釈されることはありません。つまり:=、(SET ステートメントだけでなく) 任意の有効な SQL ステートメントで を使用して、変数に値を割り当てることができます。

https://dev.mysql.com/doc/refman/5.6/en/assignment-operators.html

バックティック識別子の引用について:

識別子の引用文字はバッククォート (「`」) です。

ANSI_QUOTES SQL モードが有効になっている場合は、二重引用符で識別子を引用することもできます。

http://dev.mysql.com/doc/refman/5.6/en/identifiers.html

于 2013-01-09T23:00:58.730 に答える
53

CHECKドキュメントのごくわずかなコメントで説明されているように、制約は MySQL によって無視されます。CREATE TABLE

句は解析されますが、CHECKすべてのストレージ エンジンによって無視されます。

于 2013-01-09T22:31:15.147 に答える
16

制約はCHECKMySQLに実装されていないようです。

このバグレポートを参照してください:https ://bugs.mysql.com/bug.php?id = 3464

于 2010-01-22T06:37:29.243 に答える
-2

set sql_mode = 'STRICT_TRANS_TABLES'ORで試してくださいSET sql_mode='STRICT_ALL_TABLES'

于 2012-01-29T05:02:48.390 に答える