【问题标题】:update statement in Insert trigger on the same table同一张表上的插入触发器中的更新语句
【发布时间】:2012-09-12 07:19:38
【问题描述】:

我想在同一张表上编写一个包含 UPDATE 语句的触发器,如下所示:

create trigger AFTER INSERT ON myTable
   FOR EACH ROW BEGIN
    update myTable set ... where ...
   end

我该怎么做?

【问题讨论】:

    标签: mysql sql triggers


    【解决方案1】:

    Quoting MySQL docs:

    触发器也可以影响其他表,但不允许 修改已被使用(用于读取或写入)的表 调用函数或触发器的语句。

    【讨论】:

      【解决方案2】:

      您可以这样做(更新已触发后插入触发器的表)但为避免递归,您的 FOR INSERT 和 FOR UPDATE 触发器必须是单独的过程。另一个问题是 Microsoft SQL Server 只为任何更新语句调用一次 FOR UPDATE 触发器。 SQL Server 中没有 FOR EACH ROW。在 FOR INSERT TRIGGER 中使用单个 UPDATE... 表... WHERE 语句同时更新大量行。

      【讨论】:

        【解决方案3】:

        我认为这是不可能的。

        下面给出我创建一个表的脚本

        CREATE TABLE `tbl1` (
            `id` INT(10) NULL DEFAULT NULL,
            `msg` VARCHAR(50) NULL DEFAULT NULL
        )
        

        然后我使用以下查询在该表上创建了触发器

        delimiter |
        create trigger trigger1 before insert on tbl1 for each row begin
        update tbl1 set msg='insert occured in tbl1' where id=5;
        end
        |
        delimiter ;
        

        当我尝试运行以下查询时

        insert into tbl1 values (1,'ddd');
        

        我收到以下错误

        “无法更新存储函数/触发器中的表 'tbl1',因为它已被调用此存储函数/触发器的语句使用”

        所以这是不可能的。 欲了解更多信息,请访问 http://bugs.mysql.com/bug.php?id=50684

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-12-18
          • 1970-01-01
          • 1970-01-01
          • 2011-07-17
          • 2011-10-19
          • 2018-09-15
          • 1970-01-01
          相关资源
          最近更新 更多