SQL触发器仅在添加第二行后更新该行
行为: 如果我添加1行,则不会更新JB_Received_日期 第一次插入后的文档\轨道\主表SQL触发器仅在添加第二行后更新该行,sql,Sql,行为: 如果我添加1行,则不会更新JB_Received_日期 第一次插入后的文档\轨道\主表 MRG_JOB_ID| JB_REC_DATE --------------------------------- 00001 | null 工作表 JOB_ID | JOB_REC_DATE -------------------------------- 00001 | JUN-9-1999 00002 | JUN-17-2001 00003 | JUN-23-2008 如果添加
MRG_JOB_ID| JB_REC_DATE
---------------------------------
00001 | null
工作表
JOB_ID | JOB_REC_DATE
--------------------------------
00001 | JUN-9-1999
00002 | JUN-17-2001
00003 | JUN-23-2008
如果添加第二行,则第1行中的JB_Received_日期将更新,但第2行不会更新
第二次插入后的文档\轨道\主表
MRG_JOB_ID| JOB_REC_DATE
---------------------------------
00001 | JUN-9-1999
00002 | null
如果添加第n行,则仅更新第n-1行
第n次插入后的DOC\u TRACK\u主表
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;
好吧,事情就是这样。假设您的DOC\u TRACK\u主表中没有记录。由于触发器在Insert之前,这意味着Update语句将找不到任何要更新的行。在第一次插入之后,您现在有一条记录。当您向该表插入另一条记录时,在插入之前,触发器将转到并更新JOBS表中唯一具有匹配值的行。插入第三条记录时,触发器将更新先前插入的两条记录,依此类推。因此,实际上,在插入下一条记录之前,所有记录都会得到更新,而不是最后一条记录。它确实在更新所有记录,但您只注意到最后一个记录,因为在插入新记录之前,最后一个记录为null,而其他记录具有来自JOBS表的值。其效果与将列设置为其当前值相同,如下所示:
UPDATE TABLE1 SET COL1=COL1, COL2=COL2;
如果执行上述操作,您会注意到更新吗?我不确定这是什么DBMS,但如果它类似于SQL Server触发器,则您需要插入数据的一些标识符-现在看来,每次触发触发器时,您都在更新表中的所有数据 此外,正如其他回答/评论所述,您在插入记录之前触发了触发器,因此新插入的记录不会受到触发器的影响 在本例中,触发器似乎没有必要—为什么不将insert语句更改为同时插入日期呢 e、 g
如果出于某种原因,这种方法不适用于您,那么您需要查看RDBMS文档中插入的关键字,该关键字在触发器中引用,只影响正在操作的数据,而不影响整个表的数据。想象一下,如果您的表中有5000万行,每次向表中插入任何内容时,都会对所有5000万行进行更新,即使它们很可能被更新为相同的值可能是因为触发器在插入之前触发了?语法似乎是Oracle,但问题没有标记为Oracle,也没有提到数据库。你真的在使用Oracle吗?这个问题是通过创建一个包含两个表的视图来解决的。这个问题是通过创建一个包含两个表的视图来解决的,但你的建议就是答案,这让我们回到了那个结论。谢谢
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