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。如果nulls 是一个问题,则应在相应的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:更新时自动修改日期的主要内容,如果未能解决你的问题,请参考以下文章

如何:使用 SQL Server 2008 为自动更新修改日期创建触发器

word中如何取消日期自动更正

怎么样才能让word文档里的时间自动更新呢?

当前日期与特定日期相同时如何自动更新字段

手机时间怎么修改?

求 Oracle 大神指教,更具时间自动更新状态