SQL Trigger仅在添加第二行后更新行

时间:2014-12-12 20:16:01

标签: sql

行为: 如果我添加1行,则JB_RECIEVED_DATE不会被更新。

第一次插入后的DOC_TRACK_MAIN表

MRG_JOB_ID| JB_REC_DATE
---------------------------------
00001     | null

JOBS表

JOB_ID | JOB_REC_DATE
--------------------------------
00001  | JUN-9-1999
00002  | JUN-17-2001
00003  | JUN-23-2008

如果我添加第二行,则在第1行更新JB_RECIEVED_DATE,但不更新第2行。

第二次插入后的DOC_TRACK_MAIN表

MRG_JOB_ID| JOB_REC_DATE
---------------------------------
00001     | JUN-9-1999
00002     | null

如果我添加行n,则仅更新行n-1。

第n次插入后的DOC_TRACK_MAIN表

MRG_JOB_ID| JOB_REC_DATE
---------------------------------
00001     | JUN-9-1999
00002     | JUN-17-2001
00003     | null

我的触发器代码:

CREATE OR REPLACE TRIGGER "DB_1"."TRG_INSERT_REC_DATE" 
BEFORE INSERT ON DOC_TRACK_MAIN
FOR EACH ROW
BEGIN
    UPDATE DOC_TRACK_MAIN
    SET JB_RECEIVED_DATE = (SELECT JOB_RECEIVED_DATE FROM JOBS WHERE JOBS.JOB_ID=DOC_TRACK_MAIN.MRG_JOB_ID);
END;

2 个答案:

答案 0 :(得分:0)

好的,这就是发生的事情。假设您的DOC_TRACK_MAIN表中没有记录。由于您的触发器是在插入之前,这意味着更新语句不会找到要更新的任何行。第一次插入后,您现在有一条记录。当您向该表插入另一条记录时,在插入触发器之前将更新JOBS表中具有匹配值的唯一行。插入第三条记录时,触发器将更新之前插入的两条记录,依此类推。事实上,在插入下一条记录之前,所有记录都会更新,而不是最后一条记录。它确实更新了所有记录,但您只注意到最后一个记录,因为最后一个记录在插入新记录之前为空,其他记录具有JOBS表中的值。它具有将列设置为其当前值的相同效果,如下所示:

UPDATE TABLE1 SET COL1=COL1, COL2=COL2;

如果您执行上述操作,您会注意到更新吗?

答案 1 :(得分:0)

我不确定这是什么DBMS,但是如果它类似于SQL Server触发器,则需要一些插入数据的标识符 - 因为它现在看起来像是在更新 数据。

此外,正如其他答案/评论所述,您在插入记录之前触发了触发器,因此新插入的记录不会受到触发器的影响。

在这种情况下,触发器似乎都是不必要的 - 为什么不只是更改插入语句以插入日期?

e.g。

insert into DOC_TRACK_MAIN (MRG_JOB_ID, JB_REC_DATE)
select '00003' , JOB_RECEIVED_DATE 
FROM JOBS 
WHERE JOBS.JOB_ID=DOC_TRACK_MAIN.MRG_JOB_ID

如果由于某种原因这对您不起作用,您需要查看您的RDBMS文档,了解触发器中引用的“inserted”关键字,以便仅影响被操作的数据,而不是整个表的数据。想象一下,如果你的表中有5000万行,每次你对表中的任何插入都会发生所有5000万行的更新 - 即使它们(可能)被更新为相同的值