【问题标题】:Trigger to Update row with information触发更新行的信息
【发布时间】:2016-09-16 02:41:19
【问题描述】:

大家好,我正在尝试做一个触发器来更新一个表中的信息,但是这个表有信息,这个信息来自这个过程存储

create or replace procedure insertar (new_bod int, new_arti int, cant int)
BEGIN
  INSERT INTO bod_arti (bod_id, arti_id, cant)
       VALUES (new_bod , new_arti, new_cant);
END

在此过程中,当我尝试插入调用该过程的值时,bod_id 是 BOD 表中的 PK,arti_id 是 ARTI 表中的 PK,我有一个错误,这是因为 PK 相同。 我怎样才能在表中只插入不能并添加信息?我有这个触发器

create trigger myfirsttrigger BEFORE INSERT ON bod_arti
FOR EACH ROW
UPDATE bod_arti SET cant = cant + NEW.cant WHERE bod_id = NEW.bod_id AND arti_id = NEW.arti_id

当我使用已经插入的值再次调用该过程时,出现此错误

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

我能做什么? 谢谢!

【问题讨论】:

  • 你要更新什么表?
  • 在使用触发器插入时,您不能在其表本身上更新表
  • 您可以使用存储过程在触发器内部进行更新。
  • 不清楚您要达到的目标。您是否尝试通过执行 INSERT 向表中添加一行,并且您还想使用与插入的新行匹配的 (bod_id,art_id) 值更新表中的所有行?很奇怪。表上是否有唯一约束?如果 (bod_id,arti_id) 是唯一的,我怀疑您可能正在寻找 INSERT .. ON DUPLICATE KEY 的行为。但我只是猜测,因为从这个问题来看,根本不清楚你需要做什么。
  • 你能做的就是更好地解释你想要达到的目标。表中的样本数据、正在插入的样本数据以及结束状态,即操作后您希望表包含的内容。返回的错误消息是 MySQL 中的限制。在 BEFORE INSERT 触发器的上下文中,不可能对同一个表执行 UPDATE。

标签: mysql stored-procedures triggers plsqldeveloper


【解决方案1】:

在 oracle PLSQL 中,看看如何在下面实现这一点:

CREATE OR REPLACE PROCEDURE insertar (new_bod    INT,
                                      new_arti   INT,
                                      new_cant   INT)
AS
BEGIN
   INSERT INTO bod_arti (bod_id, arti_id, cant)
        VALUES (new_bod, new_arti, new_cant);

   COMMIT;
END;

触发器:

CREATE OR REPLACE TRIGGER myfirsttrigger
   BEFORE INSERT
   ON bod_arti
   FOR EACH ROW
BEGIN

/*In place of writing a update you can try as below*/
--   UPDATE bod_arti
--      SET cant = cant + :NEW.cant
--    WHERE bod_id = :NEW.bod_id AND arti_id = :NEW.arti_id;

     ---Create autonomous transaction
   proc_upd(:old.bod_id ,:old.arti_id,:old.cant); 

END;

自主交易

create or replace  procedure proc_upd(num1 number,num2 number, num3 number)
as
PRAGMA AUTONOMOUS_TRANSACTION;
begin

   UPDATE bod_arti     
      SET cant = cant + num3       
   WHERE bod_id = num1
    AND arti_id = num2;

    commit;

END; 

多次调用:

exec insertar(1,2,3);
exec insertar(4,5,6);

输出:

SQL> select * from bod_arti;

    BOD_ID    ARTI_ID       CANT
---------- ---------- ----------
         1          2          6
         4          5          12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 2011-07-03
    • 2022-12-29
    • 1970-01-01
    • 2017-02-08
    相关资源
    最近更新 更多