Mysql触发器没有更新记录

Posted

技术标签:

【中文标题】Mysql触发器没有更新记录【英文标题】:Mysql trigger is not updating record 【发布时间】:2021-06-30 00:43:08 【问题描述】:

我有两个表“产品”和“股票”。产品表将包含所有产品。在库存表中,我每次都将产品库存保存为一个新条目。

我有两种产品。 “1”类型的产品将有库存作为数字,“0”类型的产品将有库存作为重量。因此,在 products 表中,我创建了两列“stock_weight(保持在 stock 表中输入的总重量)”和“pieces(保持在 stock 表中输入的总数量)”。

为此,我在 stock 表上创建了一个触发器,每当我将新记录插入此表时,它将执行以更新 products 表中的总重量或数量(件)。下面是触发器的代码:

BEGIN
DECLARE product_type tinyint default 0;

SET product_type = (Select product_type from products where id = NEW.product_id);

IF (product_type = 0) THEN
    UPDATE products set stock_weight = stock_weight + NEW.net_weight where id = NEW.product_id;
ELSE
    UPDATE products set stock_pieces = stock_pieces + NEW.pieces where id = NEW.product_id;
END IF;
END  

但是在任何产品的库存表中插入新记录后,产品表中没有任何更新。我已经调试了触发器并且触发器正在执行,但产品表中没有任何更新。

谁能告诉我我错过了什么以及我做错了什么?

【问题讨论】:

看起来应该更新产品 - 请添加创建触发器语句.. 感谢您的回复。是的,我已经正确创建了触发器。我刚刚分享了我在触发器中编写的查询/逻辑。 10 + null = null 我建议你在有可能为 null 的地方合并。 【参考方案1】:

不要为变量指定与列相同的名称并避免出现空值

DROP TABLE IF EXISTS PRODUCTS,STOCKS;
create table products(id int,product_type int,stock_weight int,stock_pieces int);
create table stocks(product_id int,net_weight int,pieces int);
drop trigger if exists t;
delimiter $$
create trigger t after insert on stocks
for each row
BEGIN
DECLARE vproduct_type tinyint default 0;

SET vproduct_type = (Select product_type from products where id = NEW.product_id);

IF (vproduct_type = 0) THEN
    UPDATE products set stock_weight = coalesce(stock_weight,0) + NEW.net_weight where id = NEW.product_id;
ELSE
    UPDATE products set stock_pieces = coalesce(stock_pieces,0) + NEW.pieces where id = NEW.product_id;
END IF;
END  $$
delimiter ;

insert into products values(1,1,null,null),(2,0,null,null);

insert into stocks values(1,null,10),(2,10,null);

select * from products;

+------+--------------+--------------+--------------+
| id   | product_type | stock_weight | stock_pieces |
+------+--------------+--------------+--------------+
|    1 |            1 |         NULL |           10 |
|    2 |            0 |           10 |         NULL |
+------+--------------+--------------+--------------+
2 rows in set (0.001 sec)

【讨论】:

谢谢。我也遵循了同样的方法,但它不起作用 在我的服务器上工作,如答案所示,也在这里 -db-fiddle.com/f/oKhocKuxert8V5RLvmJR6y/0 - 所以你的结果有所不同..

以上是关于Mysql触发器没有更新记录的主要内容,如果未能解决你的问题,请参考以下文章

MySQL触发器:更新一张表中的记录,其中同一行中的记录匹配选择查询

mysql的更新问题

mysql级联更新的两种方式:触发器更新和外键

mysql 触发器-监控表字段更新

mysql 日志记录触发器,查找更改的列

MySql 触发器删除同一张表中的子记录