mysql 触发器生成时间戳_oracle 数据库触发器,插入更新时间戳

1、首先建立一个测试表

CREATE TABLE TestTragger(

UserIdintPrimary 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 BY1 --每次加几个

START WITH1 --从1开始计数

NOMAXVALUE--不设置最大值

NOCYCLE--一直累加,不循环

CACHE10;

测试插入和修改数据:

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; //修改数据

效果图:先查询现有的数据

4c6214c55d203de90244970e78513a13.png

然后执行修改操作:update testtragger set name='王五' where userid = 2;

f1eefd502bf3e2e8fe0b365440a4c168.png

修改完名称,时间戳也更新到了最新修改的时间。

注意,sysdate是精确到秒的时间戳,这个一般在粗略记录修改人的时候使用,

但是当我们是用来进行版本控制,我们需要很高的精确度,此时应该用毫秒级的时间戳:systimestamp

把触发器中的:sysdate改为systimestamp

1138573db7797c5248e85eb3645c2bb6.png

效果展示:

9fadc44424e072899195608b37130cc6.png

其实这里主键id也是可以在触发器中进行的,代码如下:

insert into testtragger(name) values('阿斯玛3');select userid,name, createtime, to_char(createtime,'yyyy-mm-dd hh24:mi:ssxff') fromtesttragger order by createtime ;

create sequence seq_testTragger_id start with1;--创建一个序列从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;--清空表

执行顺序和实例效果:

594b3a7ef4412d18a43204348c400a5c.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值