【问题标题】:SQL Error (1442) , any solution?SQL 错误 (1442) ,有什么解决办法吗?
【发布时间】:2016-01-28 19:26:57
【问题描述】:

我在 MySQL 中创建了这个触发器(在表产品更新之后):

BEGIN
 set @parentid := (select parent_id from product where product_id = new.product_id);
 if (old.price <> new.price) then
  update product set price=new.price where product_id = @parentid and price > new.price;
 end if;
END

但是,当我更新价格时,我得到了这个错误

: SQL 错误 (1442) 无法更新存储中的表“产品” 函数/触发器,因为它已被调用的语句使用 这个存储的函数/触发器。 */

我创建了两个表和两个触发器,例如:

Trigger 1(表产品更新后):

BEGIN
 if (old.price <> new.price) then
    insert into product_price
    (product_id, price , date_added)
    values
    (new.product_id, new.price, SYSDATE());
 end if;
END

Trigger 2(在表上插入后product_price):

BEGIN
 SET @parentid := (select parent_id from product where product_id = new.product_id);
 if (@parentid >0) then
  update  product set price=new.price where product_id in (select @parentid);
 end if;
END

但是,我又遇到了那个错误。

当子价格发生变化时,我确实需要更新父价格,您有什么解决方案吗?

谢谢。

【问题讨论】:

  • 你到底想做什么?在您明确更新 product.price 后,您希望它具有什么价值?
  • @JRD 他没有对正在插入或更新的行进行任何更改,他正在尝试更新父产品。
  • 我有一些子产品,我需要在父产品上显示最便宜的儿童价格。
  • @Barmar 我明白了。如果层次结构的深度超过 1 级,这似乎是一场级联的噩梦。您能否在 select 上得出最便宜的价格,而不是试图维持它?
  • @JRD 我正在尝试更改现有代码,更改所有代码以显示另一个查询是一项非常艰巨的工作,如果我可以使用类似这样的触发器,它将更安全、更容易。

标签: mysql triggers mysql-error-1442


【解决方案1】:

您不能使用触发器,因为您需要更新正在更新的同一个表。您需要将此逻辑移动到应用程序代码中或使用存储过程而不是触发器。

【讨论】:

  • 这是一个非常艰难的过程,因为有很多不同的方式来改变价格,比如(在应用程序中,从注入到 sql 和...)
  • 您别无选择,除非您将子价格和父价格移动到单独的表格中。
猜你喜欢
  • 2022-11-04
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 2018-02-19
相关资源
最近更新 更多