【Oracle】シーケンスの作成、確認、使い方まとめ(INSERT/UPDATE)

Oracle

今回は、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_NAMEMIN_VALUEMAX_VALUEINCREMENT_BYCYCLE_FLAGORDER_FLAGCACHE_SIZELAST_NUMBERSCALE_FLAGEXTEND_FLAGSHARDED_FLAGSESSION_FLAGKEEP_VALUE
SEQ_USER_ID199999999991NN201NNNNN
作成したシーケンスの設定値

作成したシーケンスの採番した番号の最大値を確認するには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_IDUSER_NAME
1山田太郎
2山田花子
シーケンスを使って採番

UPDATE文でシーケンスを使う方法

UPDATE
  USERS
SET
  USER_ID = SEQ_USER_ID.NEXTVAL
WHERE
  USER_NAME LIKE '%山田%'; 

UPDATE文でシーケンスを使って採番するには、INSERT文と同様にシーケンス名.NEXTVALを指定するだけです。

USER_IDUSER_NAME
31山田太郎
32山田花子
シーケンスを進めて、UPDATE文でUSER_IDを更新

まとめ

いかがでしたか?シーケンスの番号を進めるにはシーケンス名.NEXTVALを使用しますが、SELECT 文で取得した場合でも番号が進む点には注意が必要です。また、シーケンスは一度進むと簡単には元に戻せません。ぜひ実際にシーケンスを作成し、NEXTVALINSERT を試しながら、シーケンスの挙動を確認してみてください。

タイトルとURLをコピーしました