【问题标题】:Trigger After Update in Mysql在 Mysql 中更新后触发
【发布时间】:2022-01-24 23:11:46
【问题描述】:

我有一个名为 Product 的表,如下所示:

id price
1 50
2 51
3 12

我想在 Mysql 中创建一个 Trigger 来执行这些操作: 如果我们将新产品添加到表中或如果产品更新,则表中的所有产品价格应该是增加 10 点!

示例: 我们更新第一个由 (id=1,price=900) 更新的产品,那么最终的表格如下:

id price
1 900
2 61
3 22

我已尝试通过以下命令解决此问题,但出现错误:

CREATE trigger increase_price
after update on product.price
begin 
    if NEW.price<> old.price then
        insert into product (id,price)
        values (old.id,old.price+10)
    end if;
end;

错误:无法更新存储函数/触发器中的表,因为它已被调用此存储函数/触发器的语句使用

如果您能帮我解决这个问题,我将非常感激:)

【问题讨论】:

  • 此操作不能在触发器中执行。触发器可能会影响正在处理的行或另一个表,而不是同一个表中的另一行。使用根据存储过程而不是单个插入/更新查询。
  • 我应该用触发器实现解决方案 :((( 但是如果你能提供上面建议的完整代码块,我会很高兴,更清楚
  • 我应该用触发器实现解决方案这是不可能的。不过你当然可以试试……
  • '我应该用触发器实现解决方案' - 你为什么这么说?,鉴于提供的信息,这是不可能的原因是可以生成无限循环,插入触发触发器哪个更新触发插入等的触发器...

标签: mysql triggers sql-update


【解决方案1】:

使用存储过程:

CREATE PROCEDURE add_into_product (p_id INT, p_price INT)
BEGIN
    DECLARE EXIT HANDLER FOR SQLEXCEPTION 
    BEGIN
        ROLLBACK;
    END;
    
    SET autocommit = OFF;
    START TRANSACTION;
    UPDATE product SET price = price + 10;
    INSERT INTO product VALUES (p_id, p_price) ON DUPLICATE KEY UPDATE price = p_price;
    COMMIT;
END

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=7291fa7ad68c7947445a7591429acb6d

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 2016-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-13
    • 1970-01-01
    相关资源
    最近更新 更多