我有一张桌子
CREATE TABLE PRODUCT (
PRODUCT_ID BIGINT NOT NULL AUTO_INCREMENT,
PRICE DOUBLE NOT NULL,
NAME VARCHAR(50) NOT NULL,
PRIMARY KEY(PRODUCT_ID)
);
如果NAME不是'TestProduct',我需要一个约束来确保价格总是大于0
我一直在寻找,但却找不到合适的东西
有什么想法吗?
答案 0 :(得分:0)
你没有说明违反价值约束时会发生什么。
这是你可以采取的一种方式:
CREATE TRIGGER mytrigger AFTER INSERT ON mytable
IF (new.NAME <> 'TestProduct' AND new.PRICE <= 0)
SET new.PRICE = default_price
END IF
END;
答案 1 :(得分: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添加触发器