まず、次のようなテーブルを作成しました
CREATE TABLE Customer (
SD integer CHECK (SD > 0),
Last_Name varchar (30),
First_Name varchar(30)
);
次に、そのテーブルに値を挿入します
INSERT INTO Customer values ('-2','abc','zz');
MySQLはエラーを表示せず、値を受け入れました。
まず、次のようなテーブルを作成しました
CREATE TABLE Customer (
SD integer CHECK (SD > 0),
Last_Name varchar (30),
First_Name varchar(30)
);
次に、そのテーブルに値を挿入します
INSERT INTO Customer values ('-2','abc','zz');
MySQLはエラーを表示せず、値を受け入れました。
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 ;
それが役立つことを願っています。
残念ながら、MySQL は SQL チェック制約をサポートしていません。互換性の理由から DDL クエリで定義できますが、無視されます。
簡単な代替手段があります
データの要件が満たされない場合に、エラーを引き起こすか、フィールドをデフォルト値に設定するトリガーをBEFORE INSERT
作成できます。BEFORE UPDATE
BEFORE INSERT
MySQL 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 モードが有効になっている場合は、二重引用符で識別子を引用することもできます。
CHECK
ドキュメントのごくわずかなコメントで説明されているように、制約は MySQL によって無視されます。CREATE TABLE
句は解析されますが、
CHECK
すべてのストレージ エンジンによって無視されます。
制約はCHECK
MySQLに実装されていないようです。
このバグレポートを参照してください:https ://bugs.mysql.com/bug.php?id = 3464
set sql_mode = 'STRICT_TRANS_TABLES'
ORで試してくださいSET sql_mode='STRICT_ALL_TABLES'