SQL触发器仅在添加第二行后更新该行

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 如果添加

行为: 如果我添加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
如果添加第二行,则第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