2013-05-13 127 views
0

我有一個表Mysql的約束與條件

CREATE TABLE PRODUCT (
PRODUCT_ID BIGINT NOT NULL AUTO_INCREMENT, 
PRICE DOUBLE NOT NULL, 
NAME VARCHAR(50) NOT NULL, 
PRIMARY KEY(PRODUCT_ID) 
); 

我需要確保價格約束總是大於0,如果名稱不是「TestProduct」

我一直在尋找,並沒有能夠找到合適的東西

任何想法?

+1

可能重複http://stackoverflow.com/questions/5807231/mysql-check-約束二選一) – 2013-05-13 11:35:27

+0

檢查這個 http://dba.stackexchange.com/questions/9662/check-constraint-does-not-work 這可能會幫助你。 – 2013-05-13 11:55:50

回答

0

CHECK約束應該做你所需要的。但在MySQL中,它不起作用 - 看到這個問題: CHECK constraint in MySQL is not working

建議的解決方法是使用觸發器。

還有一個問題是,您不能在觸發器中執行ROLLBACK,因此您必須使用其他解決方法:調用不存在的過程。詳情請參閱此問題: MySQL Restrict Insert

解決方案爲您的情況

從管理員命令提示符下,執行:

SET GLOBAL log_bin_trust_function_creators=1; 
來自用戶的命令提示符下

然後:

delimiter $$ 

CREATE TRIGGER trig_price_check BEFORE INSERT ON PRODUCT 
FOR EACH ROW 
BEGIN 
IF NEW.PRICE <= 0 AND NEW.NAME != 'TestProduct' THEN 
CALL procedure_which_does_not_exist(); 
END IF; 
END 
$$ 

delimiter ; 

測試:

mysql> INSERT INTO PRODUCT(NAME,PRICE) VALUES ('bread', 100), ('milk', 200); 
Query OK, 2 rows affected (0.12 sec) 
Records: 2 Duplicates: 0 Warnings: 0 

mysql> INSERT INTO PRODUCT(NAME,PRICE) VALUES ('apple', 300), ('banana', 0); 
ERROR 1305 (42000): PROCEDURE test.procedure_which_does_not_exist does not exist 
mysql> SELECT * FROM PRODUCT; 
+------------+-------+-------+ 
| PRODUCT_ID | PRICE | NAME | 
+------------+-------+-------+ 
|   1 | 100 | bread | 
|   2 | 200 | milk | 
+------------+-------+-------+ 
2 rows in set (0.00 sec) 

注:爲完整的解決方案,你可能還需要添加觸發器,UPDATE

[MySQL的CHECK約束替代(的
+0

謝謝你這樣做 – user2205623 2013-05-13 15:06:12

0

您沒有指定違反值約束時會發生什麼。

這裏,你可以走一條路:

CREATE TRIGGER mytrigger AFTER INSERT ON mytable 
    IF (new.NAME <> 'TestProduct' AND new.PRICE <= 0) 
     SET new.PRICE = default_price 
    END IF 
END;