行为: 如果我添加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;
答案 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万行的更新 - 即使它们(可能)被更新为相同的值