【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