具有条件的Mysql约束

时间:2013-05-13 11:24:30

标签: mysql amazon-web-services

我有一张桌子

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

我一直在寻找,但却找不到合适的东西

有什么想法吗?

2 个答案:

答案 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添加触发器