当前位置: 首页 > 知识库问答 >
问题:

Mysql触发器未更新记录

微生学
2023-03-14

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

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

为此,我在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  

但在为任何产品在stock表中插入新记录后,product表中不会更新任何内容。我已经调试了触发器,触发器正在执行,但在product表中没有更新。

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

共有1个答案

蒯华彩
2023-03-14

不要为变量赋予与列相同的名称并预期为NULL

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)
 类似资料:
  • 问题内容: 我有一个UPDATE触发器,它产生如下的INSERTED和DELETED表: 插入式 已删除 我想将此更新捕获到日志表中。我的Log表(对于所有表都是全局的)是这样的(然后我必须处理我的INSERTED和DELETED表): 是表的系统object_id,我在其中执行了UPDATE语句,UPDATEd列的主键的值,是我映射到每个表中每个列的自定义ID。仅当通过UPDATE更改列的数据时

  • 如果我分别创建这两个MySQL触发器,两个触发器都执行OK。但我无法将它们组合起来,使其能够乘以持续时间x速率。 如果存在,则删除触发器;为每一行更新后创建definer=@TRIGGERSET@rate=(从语言中选择速率,其中languages.idlanguages=contracts.languages_idlanguagejes); 如果存在,则删除触发器;CREATE definer=

  • userNotesTable: 用户提醒表: 插入触发器: 更新触发器: 这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specific中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。 插入时,和会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?

  • 问题内容: 我有两个表,其中一个命名如下 另一个表具有以下字段: SID CID Per 如何为以下内容编写触发器: 如果表h1-h0的任何字段中发生 更新,则使用以下值更新表中的列: ((总数为1s-总数为0s / (总数1s +总数0s))/ 100 在此先感谢 我开发了一个触发器,但是它不起作用,它在第11行说了错误,您能说出什么问题吗? 问题答案: 在定义触发器之前,请确保更改定界符。另外

  • 问题内容: 我正在尝试编写触发器,我有下表:BookingRequest: 状态表: 被占领的房间: 我需要一个触发器,如果​​将具有相同ID的请求插入到OccupiedRoom表中,它将把BookingReques中的状态更改为1,所以我尝试了类似的操作 而且它不起作用,所以任何建议都非常有用 问题答案: 尝试这个:

  • 问题内容: 我想要一个触发器来对插入的记录执行以下操作: 更清楚的说:说我有一个包含三列的表:主键,整型,varchar。 当我这样插入时: 我想拥有: 但是当我省略时: 它应自动设置为此记录的: 扳机有可能吗?(我知道插入后可以更新记录,但使用触发器会更好。) 问题答案: 我不知道任何方法可以在一个语句中执行此操作,即使使用触发器也是如此。 @Lucky建议的触发器解决方案在MySQL中如下所示