シーケンスの作成方法
シーケンスの作成方法について説明します。
シーケンスとは、自動採番を行うDBオブジェクトです。
シーケンスの作成
ここではシーケンスを作成するSQLを説明します。
構文は以下の通りです。
構文の詳細は公式サイトを参照ください。
【文法】
CREATE SEQUENCE シーケンス名 [START WITH 開始番号] [MAXVALUE 最大値][CYCLE|NO CYCLE]-
・START WITH 開始番号
-
シーケンスを開始する番号を指定します。
・MAXVALUE 最大値
-
シーケンスの値として採番される最大の値になります。
・CYCLE | NO CYCLE
-
シーケンスの最大値または最小値に達した後に採番を行えるかを指定します。
命令 | 意味 |
---|---|
CYCLE | シーケンスが閾値(最大値、最小値)に達した際に、最小値または最大値から循環して採番します。 |
NO CYCLE | シーケンスが閾値(最大値、最小値)に達した場合採番できなくなります。 |
【実行例】
実際にSQLを実行しシーケンスを作成します。
SQLは以下の通りです。
CREATE SEQUENCE SEQ_CUST_NO START WITH 1 MAXVALUE 999999999 NO CYCLE ORDER ;
SQLの実行結果は以下の通りです。
これでシーケンスが作成されました。
SQL> CREATE SEQUENCE SEQ_CUST_NO START WITH 1 MAXVALUE 999999999 NO CYCLE ORDER 2 ; DB250000I: コマンドは正常に完了しました。
シーケンスが作成されたことを確認し、採番してみます。
SELECT SEQNAME, START, MAXVALUE FROM SYSCAT.SEQUENCES WHERE SEQNAME = 'SEQ_CUST_NO' ; SELECT NEXT VALUE FOR SEQ_CUST_NO FROM SYSIBM.DUAL ;
実行結果は以下になります。データが抽出され、採番されました。
例ではDUAL表を使用して結果を表示していますが、実際はSQL PLで変数に代入して使用したり、
INSERT文のVALUE句で指定して使用します。
SQL> SELECT SEQNAME, START, MAXVALUE 2 FROM SYSCAT.SEQUENCES 3 WHERE SEQNAME = 'SEQ_CUST_NO' 4 ; SEQNAME START MAXVALUE ------------------ -------------------------------------- -------------------------------------- SEQ_CUST_NO 1 999999999 SQL> SELECT NEXT VALUE FOR SEQ_CUST_NO FROM SYSIBM.DUAL 2 ; 1 ------------- 1
シーケンスの削除
シーケンスの削除のSQLを説明します。
構文は以下の通りです。
【文法】
DROP SEQUENCE シーケンス名【実行例】
実際にSQLを実行しシーケンスを削除します。
SQLは以下の通りです。
DROP SEQUENCE SEQ_CUST_NO ;
SQLの実行結果は以下の通りです。
これでシーケンスが削除されました。
SQL> DROP SEQUENCE SEQ_CUST_NO 2 ; DB250000I: コマンドは正常に完了しました。
採番時の注意点
シーケンスは一意な値を生成するためのオブジェクトなのでセッションごとに採番される値が異なります。
また一度採番した番号を再取得するコマンドは、一度採番を行わないとエラーになります。
-- 採番済みの番号を再取得(エラーになる) SELECT PREVIOUS VALUE FOR SEQ_CUST_NO FROM SYSIBM.DUAL ; -- 番号の採番 SELECT NEXT VALUE FOR SEQ_CUST_NO FROM SYSIBM.DUAL ; -- 前に採番した番号を参照 SELECT PREVIOUS VALUE FOR SEQ_CUST_NO FROM SYSIBM.DUAL ;
SQLの実行結果は以下の通りです。
ログイン後いきなり現在の番号を取得するとエラーになります。
採番後に取得した場合は正常に値がしゅとくできます。
SQL> -- 採番済みの番号を再取得(エラーになる) SQL> SELECT PREVIOUS VALUE FOR SEQ_CUST_NO FROM SYSIBM.DUAL 2 ; 行 1 の近くでエラー: SQL0845N PREVIOUS VALUE 式は、NEXT VALUE 式がシーケンス "SEQID = 9" の現行セッションで値を生成するまで使用できません。 SQL> -- 番号の採番 SQL> SELECT NEXT VALUE FOR SEQ_CUST_NO FROM SYSIBM.DUAL 2 ; 1 ------------- 4 SQL> -- 前に採番した番号を参照 SQL> SELECT PREVIOUS VALUE FOR SEQ_CUST_NO FROM SYSIBM.DUAL 2 ; 1 ------------- 4
別の構文
Oracle同様にシーケンス名.NEXTVAL, シーケンス名.CURRVALという構文も使用することができます。
-- 番号の採番 SELECT SEQ_CUST_NO.NEXTVAL FROM SYSIBM.DUAL ; -- 前に採番した番号を参照 SELECT SEQ_CUST_NO.CURRVAL FROM SYSIBM.DUAL ;
SQLの実行結果は以下の通りです。
前述の構文と同じように採番が行えます。
SQL> -- 番号の採番 SQL> SELECT SEQ_CUST_NO.NEXTVAL FROM SYSIBM.DUAL 2 ; 1 ------------- 5 SQL> -- 前に採番した番号を参照 SQL> SELECT SEQ_CUST_NO.CURRVAL FROM SYSIBM.DUAL 2 ; 1 ------------- 5