1

すでに作成された後にチェック制約を追加したいテーブルがあります。グーグルをして答えを見つけましたが、うまくいかないようです。これが私が試したことです:

ALTER TABLE noise_table 
    ADD CONSTRAINT chk_level CHECK (noise_level >= 0 and noise_level <= 0.1);

ただし、このステートメントを実行した後でも、チェックされた間隔の外で更新および挿入できるため、まったく機能していないように見えます。ここで何が欠けていますか?

4

2 に答える 2

3

ALTER TABLESyntaxの下に記載されているように:

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

代わりに、基準が満たされない場合にエラーを発生させるトリガーを定義BEFORE INSERTしてトリガーすることができます。BEFORE UPDATE

DELIMITER ;;

CREATE TRIGGER chk_insert_level BEFORE INSERT ON noise_table FOR EACH ROW
IF NOT (NEW.noise_level >= 0 AND NEW.noise_level <= 0.1) THEN
  CALL invalid_noise_level;  -- non-existent procedure, raises an error
END IF;;

CREATE TRIGGER chk_update_level BEFORE UPDATE ON noise_table FOR EACH ROW
IF NOT (NEW.noise_level >= 0 AND NEW.noise_level <= 0.1) THEN
  CALL invalid_noise_level;  -- non-existent procedure, raises an error
END IF;;

DELIMITER ;
于 2012-09-15T15:57:24.150 に答える
0

MySQL はチェック制約をサポートしていません。

代わりに、MySQL はチェック制約を「黙って無視」するため、エラーは表示されません。

于 2012-09-15T15:57:36.323 に答える