zoukankan      html  css  js  c++  java
  • 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;              --清空表

    执行顺序和实例效果:

  • 相关阅读:
    matlab中输入x. 与x的区别
    nginx 访问控制之deny allow
    nginx 反向代理之 负载均衡
    http 缓存机制简介
    nginx 反向代理之 proxy_cache
    nginx 反向代理之 proxy_buffering
    nginx 反向代理之 proxy_redirect
    nginx 反向代理之 proxy_set_header
    nginx 反向代理之 proxy_pass
    nginx 反向代理配置示例
  • 原文地址:https://www.cnblogs.com/likui-bookHouse/p/11231721.html
Copyright © 2011-2022 走看看