最近在使用mysql數據庫時,遇到了check約束不起作用的問題。在我設計表時,我添加了一個check約束,用于限制某一列的取值范圍。但是操作數據庫時卻發現,我所設定的限制并沒有生效,任何值都能夠被正常插入。接下來,我來探討一下這個問題。
CREATE TABLE test ( id INT NOT NULL PRIMARY KEY, age INT, CHECK (age >= 18 AND age<= 50) );
以上是我所創建的test表,其中age列的取值應該在18到50之間,但是當我執行以下語句時,仍可以成功向表中插入值。
INSERT INTO test (id, age) VALUES (1, 15); SELECT * FROM test;
為什么會出現這種情況呢?我們知道,mysql并不支持check約束,而是假裝支持了這個特性。實際上,當你不小心插入了一個不符合約束條件的值時,mysql只會給你一個warning,但并不會阻止你插入數據。比如剛剛我插入了一個age小于18的值,就只是收到了一條warning信息,但是數據仍成功插入到了表中。
那么,如何才能實現check約束的效果呢?我們可以使用觸發器來實現。下面是用觸發器實現check約束的代碼。
DELIMITER $$ CREATE TRIGGER check_age BEFORE INSERT ON test FOR EACH ROW BEGIN IF (NEW.age< 18 OR NEW.age >50) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'age value out of range'; END IF; END $$ DELIMITER ;
通過這個觸發器,當我們插入的值不符合約束條件時,mysql會自動拋出一個異常,從而阻止數據的插入。
總之,mysql自帶的check約束并不是真正的約束,不能像其他數據庫那樣保證數據的完整性。如果要實現check約束,可以借助觸發器幫助我們實現。同時需要注意,在使用觸發器時也需要做好異常處理,避免不必要的錯誤。
下一篇css 宋體 寫法