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--


免責聲明!

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



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