我有一個表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」
我一直在尋找,並沒有能夠找到合適的東西
任何想法?
我有一個表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」
我一直在尋找,並沒有能夠找到合適的東西
任何想法?
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約束替代(的謝謝你這樣做 – user2205623 2013-05-13 15:06:12
您沒有指定違反值約束時會發生什麼。
這裏,你可以走一條路:
CREATE TRIGGER mytrigger AFTER INSERT ON mytable
IF (new.NAME <> 'TestProduct' AND new.PRICE <= 0)
SET new.PRICE = default_price
END IF
END;
可能重複http://stackoverflow.com/questions/5807231/mysql-check-約束二選一) – 2013-05-13 11:35:27
檢查這個 http://dba.stackexchange.com/questions/9662/check-constraint-does-not-work 這可能會幫助你。 – 2013-05-13 11:55:50