oracle 数据库触发器,插入更新时间戳
1、首先建立一个测试表
CREATE TABLE TestTragger( UserId int Primary Key, Name VARCHAR(10) Not Null, CreateTime Timestamp Not Null );
创建索引:(用于UserId主键自增)
一、old和new在Oracle中不区分大小写;
二、old和new可以用在declare中也可以用在begin里的sql语句;(只会在begin中的sql语句里用)
三、old表示插入之前的值,new表示新插入的值。
四、new 只出现在insert和update时,old只出现在update和delete时。在insert时new表示新插入的行数据,update时new表示要替换的新数据、old表示要被更改的原来的数据行,delete时old表示要被删除的数据。
四、for each row --行级触发器,一般表记的会报错,没有深入研究
CREATE OR REPLACE TRIGGER MYUSAP //创建或替换 名称为MYUSAP的触发器 before INSERT OR UPDATE ON TestTragger //新增和修改执行前出发,对象目标:TestTragger表
FOR EACH ROW //行级触发器,每影响一行触发一次 BEGIN IF INSERTING THEN //插入数据操作 :NEW.createtime := SYSDATE; ELSIF UPDATING then //修改数据操作 :NEW.createtime := SYSDATE; END IF; END;
创建序列:
create sequence TESTTRAGGER_SQUENCE INCREMENT BY 1 -- 每次加几个 START WITH 1 -- 从1开始计数 NOMAXVALUE -- 不设置最大值 NOCYCLE -- 一直累加,不循环 CACHE 10;
测试插入和修改数据:
insert into testtragger(userid,name) values(TESTTRAGGER_SQUENCE.Nextval,'李四'); //插入数据 select userid,name, createtime, to_char(createtime,'yyyy-mm-dd hh:mm:ss') from testtragger; //查询数据 update testtragger set name='李四' where userid = 2; //修改数据
效果图:先查询现有的数据
然后执行修改操作:update testtragger set name='王五' where userid = 2;
修改完名称,时间戳也更新到了最新修改的时间。
注意,sysdate是精确到秒的时间戳,这个一般在粗略记录修改人的时候使用,
但是当我们是用来进行版本控制,我们需要很高的精确度,此时应该用毫秒级的时间戳:systimestamp
把触发器中的:sysdate改为systimestamp
效果展示:
其实这里主键id也是可以在触发器中进行的,代码如下:
insert into testtragger(name) values('阿斯玛3'); select userid,name, createtime, to_char(createtime,'yyyy-mm-dd hh24:mi:ssxff') from testtragger order by createtime ; create sequence seq_testTragger_id start with 1;--创建一个序列从1开始 CREATE OR REPLACE TRIGGER MYUSAP before INSERT OR UPDATE ON TESTTRAGGER FOR EACH ROW BEGIN IF INSERTING THEN --插入数据操作 select seq_testTragger_id.nextval into :new.UserId from dual; --:new新值 :old老值 :NEW.UserId := seq_testTragger_id.currval; --新增时为UserId赋值,利用序列自增,(oracle不支持 AUTO_INCREMENT,) :NEW.createtime := systimestamp; ELSIF UPDATING then --修改数据操作 :NEW.createtime := systimestamp; END IF; END; DROP TRIGGER MYUSAP; --删除触发器 DROP SEQUENCE seq_testTragger_id; --删除序列 DELETE FROM TESTTRAGGER; --清空表
执行顺序和实例效果:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】