我有一张桌子
CREATE TABLE PRODUCT (
PRODUCT_ID BIGINT NOT NULL AUTO_INCREMENT,
PRICE DOUBLE NOT NULL,
NAME VARCHAR(50) NOT NULL,
PRIMARY KEY(PRODUCT_ID)
);
如果名称不是“TestProduct”,我需要一个约束来确保价格始终大于 0
我一直在寻找,但找不到任何合适的
任何的想法?
我有一张桌子
CREATE TABLE PRODUCT (
PRODUCT_ID BIGINT NOT NULL AUTO_INCREMENT,
PRICE DOUBLE NOT NULL,
NAME VARCHAR(50) NOT NULL,
PRIMARY KEY(PRODUCT_ID)
);
如果名称不是“TestProduct”,我需要一个约束来确保价格始终大于 0
我一直在寻找,但找不到任何合适的
任何的想法?
您没有指定违反值约束时会发生什么。
这是您可以采用的一种方法:
CREATE TRIGGER mytrigger AFTER INSERT ON mytable
IF (new.NAME <> 'TestProduct' AND new.PRICE <= 0)
SET new.PRICE = default_price
END IF
END;
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 添加触发器