oracle入坑日記<六>自增列建立和清除(含序列和觸發器的基礎用法)

0
 
前言

用過 SQLserverMySQL 的自增列(auto_increment),然而 Oracle 在建表設置列時卻沒有自增列。html

查閱資料後發現 Oracle 的自增列須要手動編寫。sql

1
 
序列

 1.一、建立序列(sequence)數據庫

create sequence [sequence_name]  --建立序列
increment by 1  --遞增步長爲1
start with 1    --開始值爲1
nomaxvalue      --沒有最大值 (設置最大值:maxvalue 1000)
minvalue 1      --最小值爲1  (不設最小值:nominvalue)
nocycle         --不循環    (設置循環:cycle)
cache 20;       --緩存20    (不設緩存:nocache)

 序列的全部屬性都是選擇設置(非必須設置),若所有屬性使用默認值可直接使用 create sequence [sequence_name]; 緩存

1.二、各屬性默認值oracle

  increment (步長): 1;flex

  start (開始值) : 1;spa

  maxvalue (最大值) : 10的28次方;3d

  minvalue (最小值) : 1 ;code

  cycle (循環) : no ;orm

  cache (緩存) : 20 ;

  

1.三、序列使用

  1.3.一、當前序列值: [sequence_name].currval --當前序列值 

     在dual表中查看當前序列值: select [sequence_name].currval from dual; 

  1.3.二、下一個序列值(實現自增):  [sequence_name].nextval --下一個序列值 

     初建立的序列必須先調用一次 nextval 才能使用 currval , 由於初次建立的序列沒有當前值,因此必須產生一個值以後纔有當前值。

1.四、序列中緩存的理解

  序列中的緩存是就是一次性儲備必定數量的空間,相似數據庫初創時設置的自增大小同樣;當序列被使用至當前最大儲備值時,系統將再次準備緩存數量的空間。用系統表  user_sequence  記錄序列對象的變化來幫助理解緩存(重點看 last_number 的變化)。

  初創序列時的數據狀況

  

  當調用一次 nextval 後

  

  當序列值使用到當前 laser_number 時, laser_number 值 = 當前last_number + cache_size

  

建立序列後就已經能夠實現自增列的效果,例: 

insert into ryxxb values (AUTOSEQ.nextval,'張三',AUTOSEQ.nextval + 100,'')  --給人員信息表插入一條數據 id和編號 就使用序列

2
 
觸發器

 2.一、建立觸發器基本語法

CREATE OR REPLACE TRIGGER [trigger_name]
{[before] | [after] | [instead of]}  --{[以前] | [以後 | [替換]} 觸發時機
{[insert] | [delete] | [update[of column]]}  --{[插入] | [刪除] | [更新]{更新時可指定列名,僅在更新指定列時纔會觸發}} 觸發操做
ON {[table_name] | [view_name]} --{[代表] | [視圖名]} 觸發器目標
[FOR EACH ROW] --可選 觸發器類型 [FOR EACH ROW (行級觸發器)] 或 語句觸發器
[WHEN (condition)] --可選 觸發條件 可選擇加入觸發條件
BEGIN
  [pl\sql] --觸發器執行內容
END

 2.二、爲自動序列建立觸發器

create trigger autotri  --建立觸發器
before insert on ryxxb   --[ryxxb]在執行[insert]操做以前觸發
  for each row           --行級觸發器
    -- 觸發器內容
    begin
      select autoseq.nextval into :new.ryid from dual;  --取下一個序列值賦值給[ryid]字段
      select (autoseq.currval + 100) into :new.rybh from dual;  --取當前序列值賦值+100給[rybh]字段
      end;
3
 
清空自動序列

3.一、手動清空序列

  1)查看當前序列的值: select seq_auto.currval from dual; 

  

  2)根據當前序列值設置序列步長: alter sequence seq_auto increment by -120; 

  3)獲取next序列值: select seq_auto.nextval from dual; 

  

  4)還原序列步長: alter sequence seq_auto increment by 1; 

3.二、用儲存過程實現自動清空序列

create or replace procedure pro_clear_seq(v_seqname varchar2)         -- 建立儲存過程 par:要清空的序列名
    as n number(10);
    tsql varchar2(100);
 begin
 execute immediate 'select '||v_seqname||'.nextval from dual' into n;    -- 獲取序列當前值
  n:=-(n-1);
  tsql:='alter sequence '||v_seqname||' increment by '|| n;                -- 更新步長爲當前序列負值
  execute immediate tsql;
 execute immediate 'select '||v_seqname||'.nextval from dual' into n;    -- 獲取next序列值
  tsql:='alter sequence '||v_seqname||' increment by 1';                -- 還原步長爲1
 execute immediate tsql;
 end seq_reset;

執行儲存過程:

begin 
  pro_clear_seq('seq_auto'); 
end;

<<============================================================================================================================================>>

此日記系列僅作普通開發使用Oracle,並不是專業DBA
相關文章
相關標籤/搜索