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;              --清空表

 

執行順序和實例效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM