Oracle:更新时自动修改日期
Posted
技术标签:
【中文标题】Oracle:更新时自动修改日期【英文标题】:Oracle : Automatic modification date on update 【发布时间】:2011-09-20 09:13:50 【问题描述】:我在 oracle 中有一个表,我想研究在线更新
id number,
title varchar2(10),
modify_date date
我创建了一个触发器来提供 modify_date :
create or replace
TRIGGER schema.name_of_trigger
BEFORE UPDATE ON schema.name_of_table
FOR EACH ROW
BEGIN
:new.modify_date := sysdate;
END;
但是当我从另一个表进行大更新时,我希望仅对具有新值的行而不是所有行更新 modify_date。
update mytable a set title = (select title from mytable2 b where b.id = a.id)
有可能吗?我以为 Oracle 不会更新具有相同值的字段
谢谢
【问题讨论】:
【参考方案1】:你想错了,Oracle 会按照你的要求去做。
你可以试试
update mytable a set title =
(select title from mytable2 b
where b.id = a.id and
b.title != a.title)
或更改触发器以专门检查不同的标题名称。
create or replace
TRIGGER schema.name_of_trigger
BEFORE UPDATE ON schema.name_of_table
FOR EACH ROW
BEGIN
-- Check for modification of title:
if :new.title != :old.title then
:new.modify_date := sysdate;
end if;
END;
【讨论】:
如果值不同,如何告诉触发器不要更新日期? 您在触发器中将:new.title
与:old.title
进行比较。
!=
不会捕获空值。
@jonearles:你是对的。我假设(但没有验证)title
列是not null
。如果null
s 是一个问题,则应在相应的if
语句中明确检查。【参考方案2】:
CREATE OR REPLACE TRIGGER TRG_AFT_UPD_MFD BEFORE UPDATE ON SUPER_TEST FOR EACH ROW
BEGIN
IF :NEW.MODIFIED_ON != SYSDATE THEN
:NEW.MODIFIED_ON := SYSDATE;
DBMS_OUTPUT.PUT_LINE('UPDATE :'||:NEW.MODIFIED_ON);
END IF;
END;
【讨论】:
以上是关于Oracle:更新时自动修改日期的主要内容,如果未能解决你的问题,请参考以下文章