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

我一直在寻找,但找不到任何合适的

任何的想法?

4

2 回答 2

0

您没有指定违反值约束时会发生什么。

这是您可以采用的一种方法:

CREATE TRIGGER mytrigger AFTER INSERT ON mytable
    IF (new.NAME <> 'TestProduct' AND new.PRICE <= 0)
        SET new.PRICE = default_price
    END IF
END;
于 2013-05-13T12:04:53.827 回答
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 添加触发器

于 2013-05-13T12:22:28.713 回答