程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2序列簡介及使用

DB2序列簡介及使用

編輯:DB2教程

DB2序列簡介及使用   一、創建序列 序列是按照一定的規則生產的數值,序列的作用非常的大,比如銀行交易中的流水號,就是記錄每筆交易的關鍵字段。 通過create sequence語句創建序列,具體語法如下: >>-CREATE--+------------+--SEQUENCE--sequence-name--·----------->            '-OR REPLACE-'                                       .-AS INTEGER--------.                                         >--+-------------------+--·--+------------------------------+--->    '-AS--| data-type |-'     '-START WITH--numeric-constant-'              .-INCREMENT BY 1-----------------.       >--·--+--------------------------------+--·--------------------->       '-INCREMENT BY--numeric-constant-'              .-NO MINVALUE----------------.       >--+----------------------------+--·---------------------------->    '-MINVALUE--numeric-constant-'              .-NO MAXVALUE----------------.     .-NO CYCLE-.       >--+----------------------------+--·--+----------+--·----------->    '-MAXVALUE--numeric-constant-'     '-CYCLE----'              .-CACHE 20----------------.     .-NO ORDER-.       >--+-------------------------+--·--+----------+--·-------------><    +-CACHE--integer-constant-+     '-ORDER----'          '-NO CACHE----------------'  簡化寫如下: create sequence seq_name start with a increment by b minvalue c maxvalue d no cycle cache e order 參數簡介如下: or replace:若有創建序列重名的序列,那麼將會被替代(先刪除,再創建) as datatype:指定數據類型,這裡說明下,序列的數據類型只能為數值型,             如,smallint,integer,bigint,不帶小數點的decimal類型。 start with:指定序列的起始值,默認情況下,對於升序的序列是當前指定數據類型的最小值,             對於降序序列的是當前指定類型的最大值。 increment by:指定增長的值,默認值為1,正數表示此序列為增長升序的,負數表示此序列為降序的。 minvalue:最小值,若降序序列,no cycle的話,到此值的時候就不再生成序列值了; no minvalue:對於升序序列來說,此值為start with的值,如果start with值未指定的話就是1.              對於降序序列來說,此值就是指定數據類型的最小值。 maxvalue:指定生產序列的最大值, no maxvalue:對於升序序列來說,此值為指定數據類型的最大值;              對於降序序列來說,此值為start with值,若未指定start with值的話就是-1. cycle:循環使用數據值,對於升序序列來說,當達到了最大值之後,下一個值將會是其最小值;        對於降序序列來說,達到最小之後,下一個序列值為其最大值。 no cycle:當達到序列的邊界值之後,就不再產生序列值,默認選項。 cache:緩存序列值,表示每次應用此序列的時候,預先生產並存放在內存中的序列值。        其作用是有效的降低了寫日志的I/O操作。        若在使用的過程中,出現系統錯誤的話,那麼所有這些緩存值將會丟失。        最小值為2,默認為20 no cache:當指定此選項的時候,內存中不會存儲任何序列值,無論出現什麼異常現象都不會影響到此序列,           每次生存新的序列值,都會導致寫日志的I/O操作。 order:按照請求的順序生成值。 no order:不會按照請求的順序生成值,默認情況。   下面創建一個序列seq_001: create sequence seq_001  start with 1  increment by 1  no maxvalue  no cycle  cache 21 DB20000I  SQL 命令成功完成。     查看編目表中存放的序列seq_001的信息: SELECT SEQNAME,START,INCREMENT,MINVALUE,MAXVALUE,CYCLE,CACHE,ORDER  FROM SYSCAT.SEQUENCES WHERE SEQNAME='SEQ_001' SEQNAME     START      INCREMENT     MINVALUE     MAXVALUE     CYCLE   CACHE     ORDER --------- ----------   -----------   ----------   ------------ ------   ------- -------- SEQ_001      1.        1.              1.          2147483647.  N         21         N       1 條記錄已選擇。     注意事項: 1、常量序列,也就是一個不會改變其生成值的序列。    創建的時候,指定增長值為0,即increment by 0,不過start with值不能超過其數據類型的最大最小值;    另一種方法,指定start with值,minvalue值,和maxvalue值相等。 2、當序列定義為no cycle,可以通過alter sequence改變其屬性,讓其達到邊界值之後還能繼續產生序列值,    即從no cycle修改為cycle 3、當定義序列時指定cycle,除了increment by 1或者-1之外,序列生成的最大值將不是指定數據類型的最大值;    如,一個序列定義為start with=1,increment=2,maxvalue=10,則能夠生成的最大值將會是9,而不是10. 4、序列的定義者擁有序列的alter和usage特權(with grant option,可將其授予其他用戶),    序列的擁有者可以刪除序列。 5、下面2點使用與所有DB2數據庫版本,非標准信息:    1).A comma can be used to separate multiple sequence options    2).novinvalue,nomaxvalue,nocycle,nocache,noorder可以替代        no minvalue,no maxvalue,no cycle,no cache,no order。   二、修改序列 語法如下: >>-ALTER SEQUENCE--sequence-name-------------------------------->        .-----------------------------------------------.       V  (1)                                          |    >----------+-RESTART--+------------------------+-+-+-----------><            |          '-WITH--numeric-constant-' |                 +-INCREMENT BY--numeric-constant------+                 +-+-MINVALUE--numeric-constant-+------+                 | '-NO MINVALUE----------------'      |                 +-+-MAXVALUE--numeric-constant-+------+                 | '-NO MAXVALUE----------------'      |                 +-+-CYCLE----+------------------------+                 | '-NO CYCLE-'                        |                 +-+-CACHE--integer-constant-+---------+                 | '-NO CACHE----------------'         |                 '-+-ORDER----+------------------------'                   '-NO ORDER-'  參數簡介: restart:重置序列,如果沒有指定with n時,序列將按照create sequence時指定參數去產生值。 with:重置序列,並按照重新指定的值去生成序列值,可以使任意值。 其他參數與create sequence時一樣的。 從語法中可以看出,可以修改的屬性如下: 1、序列其實值(或重置) 2、increment值 3、最大最小值 4、cache值 5、當達到邊界值的時候,是否循環產生序列值 6、是否按照請求順序產生序列值     注意: 1、序列的數據類型不能修改,若要修改,只能刪除當前序列,重建時指定想要的數據類型。 2、當修改的時候,所有的緩存值將會丟失。 3、當將序列修改為cycle之後,序列將會產生重復的值。     下面是一個實例: alter sequence seq_001 increment by 2 maxvalue 20 cycle no cache DB20000I  SQL 命令成功完成。 SELECT SEQNAME,START,INCREMENT,MINVALUE,MAXVALUE,CYCLE,CACHE,ORDER  FROM SYSCAT.SEQUENCES WHERE SEQNAME='SEQ_001' SEQNAME     START      INCREMENT     MINVALUE     MAXVALUE     CYCLE   CACHE     ORDER --------- ----------   -----------   ----------   ------------ ------   ------- -------- SEQ_001      1.        2.              1.          20.          Y          1         N       1 條記錄已選擇。 我們可以看出no cache其實是cache 1。     三、序列的使用 可以通過兩個表達式來獲取序列的值,next value獲取下一個值,previous value獲取當前值; 為了保持DB2向後的兼容,也可以使用nextval和prevval獲取下一個序列值和當前序列值。 當首次引用序列的時候,只能使用next value獲取其第一個值;否則將會得到下面的錯誤信息: db2 => insert into test1(cid,cname,sex,age) values(previous value for seq_001,'scott','M',30) DB21034E  該命令被當作 SQL 語句來處理,因為它是無效的“命令行處理器”命令。在 SQL 處理期間,它返回: SQL0845N  在 NEXT VALUE 表達式在序列 "SEQID = 7" 的當前會話中生成值之前,不能使用 PREVIOUS VALUE 表達式。  SQLSTATE=51035     db2 => insert into test1(cid,cname,sex,age) values(next value for seq_001,'scott','M',30) DB20000I  SQL 命令成功完成。 db2 => select * from test1     CID        CNAME                SEX AGE ---------- -------------------- --- ----------- 1          scott                M            30       1 條記錄已選擇。   next value和previous value可以使用在select,values,insert,和update語句中,不能使用在where語句中。   --the end--  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved