【ORACLE】シーケンスを作成・変更・削除するSQL


ここではORACLEデータベースで、シーケンス・順序(sequence)を作成・変更・削除する方法を紹介します。

シーケンスの一覧を確認する方法は↓紹介していますので参考にしてください。
>>【ORACLE】シーケンスの一覧を確認するSQL

シーケンスとは

シーケンスとは、連続した数値を自動生成してくれるオブジェクトです。

例えば、あるテーブルに一意の連番を登録したいとき、シーケンスを使うことで簡単に連番を登録することが出来ます。

シーケンスは一意の連続した数値を生成できるので、主キーに使われることも多いです。

シーケンスを作成するSQL

シーケンスの作成はCREATE SEQUENCE文を使います。

シーケンスの作成や変更、削除には↓の権限が必要です。
 作成:CREATE SEQUENCEまたはCREATE ANY SEQUENCE
 変更:ALTER ANY SEQUENCE
 削除:DROP ANY SEQUENCE
 参照:SELECT ANY SEQUENCE

システム権限の付与の方法については↓で紹介していますので参考にしてください。
>>【ORACLE】システム権限を付与・取消するSQL

CREATE SEQUENCE文の基本構文

CREATE SEQUENCEの基本構文は次の通りです。

CREATE SEQUENCE シーケンス名
[ START WITH 開始値 ]
[ INCREMENT BY 増分 ]
[ MAXVALUE 最大値 | NOMAXVALUE ]
[ MINVALUE 最小値 | NOMINVALUE ]
[ CYCLE | NOCYCLE ]
[ CACHE CACHE数 | NOCYCLE ]
[ ORDER | NOORDER ] 

・[ START WITH 開始値 ]でシーケンスの開始値を指定します。

・[ INCREMENT BY 増分 ]でシーケンスの増分値を指定します。

・[ MAXVALUE 最大値 | NOMAXVALUE ]でシーケンスの最大値を、[ MINVALUE 最小値 | NOMINVALUE ]で最小値を指定します。

・[ CYCLE | NOCYCLE ]でシーケンスが最大値に達した時、初期値に戻ってくりかすかどうか指定します。

・[ CACHE CACHE数 | NOCYCLE ]でシーケンスをキャッシュするかどうか指定します。

・[ ORDER | NOORDER ]でシーケンスの順番を保証するかどうか指定します。 

CREATE SEQUENCE文のSQLサンプル

CREATE SEQUENCEのSQLサンプルを紹介します。

次のSEQUENCEでは開始値を1、10ずつ増分するように指定しています。最大値は100で、キャッシュには10個保持させています。

CREATE SEQUENCE sq1
 START WITH 1
 INCREMENT BY 10
 MAXVALUE 100
 CACHE 10
;

シーケンスを変更するSQL

シーケンスを変更するときはALTER文を使います。パラメータは基本的にCREATE文と同じです。

次のALTER文では増分を100に、最大値を500に変更しています。

ALTER SEQUENCE sq1
 INCREMENT BY 100
 MAXVALUE 500
;

シーケンスを削除するSQL

シーケンスを削除するときはDROP文を使います。

DROP SEQUENCE sq1;

シーケンスを使うSQL

シーケンスを使うときは「シーケンス名.CURRVAL」、もしくは「シーケンス名.NEXTVAL」を使います。

・「シーケンス名.CURRVAL」
 最後に採番したシーケンス番号を取得します。

・「シーケンス名.NEXTVAL」
 シーケンスの次の番号を取得します。

次のSQLでは最後に採番したシーケンス番号を取得しています。

SELECT seq1.currval FROM dual;

次のSQLではシーケンスの次の番号を取得しています。

SELECT seq1.nextval FROM dual;

シーケンスがずれる・欠番が発生する原因

シーケンスを使っているとズレ・欠番が発生することがあります。

シーケンスがずれたり、欠番が発生する原因を3つ紹介します。
 1.採番されたけど使われなかった
 2.ORACELデータベースの停止
 3.共有プールのキャッシュアウト
以上の3つです。

以降でもう少し詳しく紹介します。

1.採番されたけど使われなかった

1つ目はシーケンスが採番されたけど、使われなかった場合です。

例えば、INSERT文で主キーとしてシーケンスを採番したものの、途中でロールバックされた場合です。

ロールバックされてもシーケンス自体はロールバックされずに採番されたままになります。採番されたシーケンスは使われず、欠番となりずれます。

2.ORACELデータベースの停止

2つ目はORACLEデータベースの停止です。

シーケンスを採番してキャッシュに保持している場合、ORACLEデータベースの停止と同時に、キャッシュに保持していたシーケンスは破棄されます。

これはデータベースの停止を伴う再起動でも同じです。

3.共有プールのキャッシュアウト

3つ目は共有プールのキャッシュアウトです。

シーケンスをキャッシュに持たせている場合、しばらく使われないと自動的にキャッシュアウト(破棄)されます。

しばらくシーケンスが使われなかった場合には破棄されて、欠番となってしまいます。

まとめ

シーケンスの作成はCREATE SEQUENCE文、変更はALTER文、削除はDROP文を使います。

シーケンスには開始値や最大値、最小値、キャッシュに保持されるかどうかも指定することが出来ます。

シーケンスの作成や変更、削除には↓の権限が必要です。
 作成:CREATE SEQUENCEまたはCREATE ANY SEQUENCE
 変更:ALTER ANY SEQUENCE
 削除:DROP ANY SEQUENCE
 参照:SELECT ANY SEQUENCE

システム権限の付与の方法については↓で紹介していますので参考にしてください。
>>【ORACLE】システム権限を付与・取消するSQL