oracle通过触发器自动更新表的修改时间

Oracle通过触发器自动更新表的修改时间

在mysql里,我们通常在创建表时会设置一个创建时间(create_time)和一个修改时间(update_time),然后给创建时间设置默认值CURRENT_TIMESTAMP,给修改时间设置默认值CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,这样就能让创建时间和修改时间在插入数据时自动插入当前时间,而在修改数据时,自动更新修改时间。
而在Oracle中我们可以通过给创建时间和修改时间设置默认值为sysdate,但是,却不能给修改时间设置为在修改数据时自动更新修改时间。

这个时候就需要用到触发器了。定义一个触发器,当修改表中的数据时,让触发器去更新修改时间。


我的数据库里有一张表叫做students,其中有一列叫做update_time,如下图所示:
表名叫做students,其中有一列叫做update_time即修改时间的字段

下面是触发器的代码。

create or replace trigger trig_students_auto_update_time
before
update on students
for each row
begin
  select sysdate into :NEW.update_time from dual;
end;

这样一个随着修改表中数据而自动更新修改时间的触发器就写好了。


最后,说一下我开始写的错误的触发器以及问题。

-- 错误示例
create or replace trigger trig_students_auto_update_time
after
update of update_time on students
for each row
begin
  select sysdate into :NEW.update_time from dual;
end;/

第一,我在end;的后面还加上了一个斜杠/,我以为/斜杠是最后的结束符,这导致我在创建好之后,执行修改语句的时候报错:触发器 无效且未通过重新验证。这个时候在plsql developer工具里面是可以看到触发器那里报错的,点到触发器里面去看一下,它会有相应的提示的。如下图所示

触发器报错提示1
触发器报错提示2

第二个问题是因为我用到了:new的变量值,而这个值在after的时候只能读。关于before和after的区别可以参考这篇文章

https://www.cnblogs.com/zzwlovegfj/archive/2012/07/05/2578574.html

第三,就在我上面的问题都解决了,以为要迎来光明的时候,在执行修改语句的时候发现这条数据的修改时间还是没有改变,然后看了下触发器,也没有显示错误啊。之后发现是因为我在触发器里面写了update of update_time的原因。这句话的意思是当修改了update_time字段的时候才会触发该触发器。把of update_time给去掉就好了。

以上问题,都是源于一个连触发器都没太弄明白就想写自动更新表的修改时间的触发器的渣渣。看触发器语法的时候感觉不难,结果写起来就不是那么回事了。


最最后,附上某培训机构关于触发器的ppt的截图。

触发器语法相关讲解

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值