2012-09-15 19 views
1

我有一張表,我想在檢查約束已經創建後添加它。我做了一些谷歌搜索,並找到了一些答案,但他們似乎沒有工作。這是我曾嘗試:在表中填充檢查約束到數據已滿

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

但是,運行此語句後,我還是可以更新和插入檢查區間之外,因此它不會出現在所有的工作。我在這裏錯過了什麼?

+1

MySQL根本不支持檢查約束。 –

回答

3

由於ALTER TABLE Syntax下記載:

CHECK子句解析,但所有的存儲引擎忽略。

你可以代替定義BEFORE INSERTBEFORE UPDATEtriggers加薪事件的錯誤,你不符合標準:

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 ; 
+0

MySQL不支持引發真正的異常嗎? –

+0

@a_horse_with_no_name:你說得對,從5.5開始['SIGNAL'](http://dev.mysql.com/doc/en/signal.html)。我仍然陷入5.1世界。 :( – eggyal

0

MySQL不支持檢查約束。

相反,MySQL「默默地忽略」檢查約束,因此它不顯示錯誤。

+0

有趣的......那麼你如何執行限制,如「列x只能在值x和y之間」?當然有幾個數據庫強制執行這樣的約束...... – zebra

+0

@斑馬:這隻能使用MySQL中的觸發器。 –