今回は、Oracleのシーケンス(SEQUENCE)について説明します。シーケンス(SEQUENCE)は一意な連番を採番するためのもので、 主に ID(主キー)採番 で使用されることが多いです。この記事を読むことで、シーケンスの作成から、確認、使い方がわかるようになると思います。
シーケンスの作成
シーケンスの作成は、テーブルの作成と同様にCREATEで作成でき、DROPで削除できます。
CREATE SEQUENCE シーケンス名; -- シーケンスの作成DROP SEQUENCE シーケンス名; -- シーケンスの削除シーケンスを作成する時には、オプションが指定できます。
実際に、オプションを指定してシーケンスを作成してみたいと思います。
CREATE SEQUENCE SEQ_USER_ID -- ユーザーIDを採番する想定のシーケンス
START WITH 1 -- 1から採番
INCREMENT BY 1 -- 1,2,3と番号が1ずつ増加
MINVALUE 1 -- 最小番号
MAXVALUE 9999999999 -- 最大番号(最大桁数で指定)
NOCYCLE; -- 循環しない(最大値に達したらエラー)作成したシーケンスを確認するには…
SELECT
*
FROM
USER_SEQUENCES -- またはALL_SEQUENCES (参照権限のある全シーケンスを確認する場合)
WHERE
SEQUENCE_NAME = 'SEQ_USER_ID';条件にSEQUENCE_NAME = ‘作成したシーケンス名’ を指定します。テーブルのように直接 SELECT * FROM シーケンス名では確認できないため注意が必要です。
| SEQUENCE_NAME | MIN_VALUE | MAX_VALUE | INCREMENT_BY | CYCLE_FLAG | ORDER_FLAG | CACHE_SIZE | LAST_NUMBER | SCALE_FLAG | EXTEND_FLAG | SHARDED_FLAG | SESSION_FLAG | KEEP_VALUE |
| SEQ_USER_ID | 1 | 9999999999 | 1 | N | N | 20 | 1 | N | N | N | N | N |
作成したシーケンスの採番した番号の最大値を確認するにはLAST_NUMBERを指定します。
SELECT
LAST_NUMBER
FROM
USER_SEQUENCES
WHERE
SEQUENCE_NAME = 'SEQ_USER_ID';| NEXTVAL |
| 1 |
シーケンスの番号を進めるにはシーケンス名.NEXTVALになります。
SELECT
SEQ_USER_ID.NEXTVAL -- 次のシーケンス番号を取得(同時に番号が進む)
FROM
DUAL;
シーケンスの番号は NEXTVAL により進めることはできますが、簡単に元へ戻すことはできません。番号を戻したい場合は、
- シーケンスを削除して再作成する
- INCREMENT BY を一時的にマイナスに変更して調整する
といった方法を取ります。
ALTER SEQUENCE SEQ_USER_ID INCREMENT BY -100; --インクリメントの変更INSERT文でシーケンスを使う方法
-- テーブル作成
CREATE TABLE USERS (
USER_ID NUMBER(10) PRIMARY KEY,
USER_NAME VARCHAR2(50) NOT NULL
);
-- データ登録
INSERT
ALL INTO USERS (USER_ID, USER_NAME)
VALUES
(SEQ_USER_ID.NEXTVAL, '山田太郎');
INSERT INTO
USERS (USER_ID, USER_NAME)
VALUES
(SEQ_USER_ID.NEXTVAL, '山田花子');INSERT文でシーケンスを使って採番するには、シーケンス名.NEXTVALを指定するだけです。
| USER_ID | USER_NAME |
| 1 | 山田太郎 |
| 2 | 山田花子 |
UPDATE文でシーケンスを使う方法
UPDATE
USERS
SET
USER_ID = SEQ_USER_ID.NEXTVAL
WHERE
USER_NAME LIKE '%山田%'; UPDATE文でシーケンスを使って採番するには、INSERT文と同様にシーケンス名.NEXTVALを指定するだけです。
| USER_ID | USER_NAME |
| 31 | 山田太郎 |
| 32 | 山田花子 |
まとめ
いかがでしたか?シーケンスの番号を進めるにはシーケンス名.NEXTVALを使用しますが、SELECT 文で取得した場合でも番号が進む点には注意が必要です。また、シーケンスは一度進むと簡単には元に戻せません。ぜひ実際にシーケンスを作成し、NEXTVAL や INSERT を試しながら、シーケンスの挙動を確認してみてください。

