mysql - 触发减少计数器

标签 mysql database

我想创建一个触发器,在下订单后减少可用商品的数量。

我试图创建一个触发器。我正在使用 phpMyAdmin,在表 products_in_order

中设置触发器 AFTER INSERT
       SET @qtt = (
           SELECT quantity  
           FROM products_in_order
           ORDER BY inorder_id DESC
           LIMIT 1)

       SET @code = (
           SELECT product_code  
           FROM products_in_order
           ORDER BY inorder_id DESC
           LIMIT 1)

           UPDATE products 
           SET quantity = quantity-@qtt
           WHERE product_code=@code

为什么第一个 SET 可以工作,第二个也可以,但是当我同时编写它们时,我会收到错误消息?

如何让这个触发器正常工作?

示例数据:

products 表示商店中所有可用的产品,并且有列:

product_code | name | price | quantity

product_in_order 表示一组相同类型的产品,可以添加到订单中。它有列:

inorder_id |产品代码 |价格 |订单号

inorder_id | product_code | price | quantity | order_no

当有人在订单中添加一组产品时,我希望该产品的总数量减少。

最佳答案

您不需要重新连接到新插入/更新的表* - 只需使用 New pseudo row从你的触发器中,它已经有你需要加入主 Product 表的值:

CREATE TRIGGER `MyTrigger` 
    AFTER INSERT ON `products_in_order`
    FOR EACH ROW 
    BEGIN
      UPDATE products
           SET quantity = quantity-New.quantity
           WHERE product_code=New.product_code;
    END;

SqlFiddle here证明 Product 的起始值已被插入到适用产品代码的 products_in_order 中的数量所耗尽。

* 假设 inorder_id 是一个 AUTO_INCREMENT,在没有任何锁定考虑的情况下从该表中选择两次也容易出现并发问题,例如如果另一个作者在您的触发器执行时插入了另一行。使用 New

的另一个好理由

关于mysql - 触发减少计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29833368/

相关文章:

php - mySQL 将标题大写结果作为 JSON 数组 | PHP

mysql - 更新触发器不起作用后,不知道如何设置适当的条件

database - Oracle 存储过程,SELECT

MySQL InnoDB 外键错误

java - (Tomcat) Java WAR 通过 SSL 连接到 MySQL

mysql - 将 docker 容器连接到本地工作台 MySQL DB

mongodb - 奥帕 1.01 : how to prevent opa from running it's own mongo database

PHP点击ling,根据ID打开新的PHP页面

java - JSP GlassFish 错误

mysql - ColdFusion 和 mySQL 中的日期格式错误