Oracle通过触发器自动更新表的修改时间
在mysql里,我们通常在创建表时会设置一个创建时间(create_time)和一个修改时间(update_time),然后给创建时间设置默认值CURRENT_TIMESTAMP
,给修改时间设置默认值CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
,这样就能让创建时间和修改时间在插入数据时自动插入当前时间,而在修改数据时,自动更新修改时间。
而在Oracle中我们可以通过给创建时间和修改时间设置默认值为sysdate
,但是,却不能给修改时间设置为在修改数据时自动更新修改时间。
这个时候就需要用到触发器了。定义一个触发器,当修改表中的数据时,让触发器去更新修改时间。
我的数据库里有一张表叫做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工具里面是可以看到触发器那里报错的,点到触发器里面去看一下,它会有相应的提示的。如下图所示
第二个问题是因为我用到了: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的截图。