【Oracle】シーケンスの変更方法完全ガイド|ALTER SEQUENCE全パラメータ・現在値のリセット・START WITH変更不可の回避策まで解説

【Oracle】シーケンスの変更方法完全ガイド|ALTER SEQUENCE全パラメータ・現在値のリセット・START WITH変更不可の回避策まで解説 Oracle

Oracleでシーケンスを変更するには ALTER SEQUENCE 文を使います。増分値やキャッシュ件数など多くのパラメータを変更できますが、「START WITH(開始値)は ALTER SEQUENCE では変更できない」という重要な制約があります。

インターネット上の情報の中には誤って「ALTER SEQUENCE で START WITH を変更できる」と書かれているものがありますが、実際に実行すると ORA-02765 エラーになります。開始値を変えたい場合は別の方法が必要です。

この記事では、ALTER SEQUENCE の全パラメータ詳細から、変更できないパラメータへの対処法シーケンスを任意の値にリセットするテクニックまで実務で使う知識を体系的に解説します。

この記事でわかること
・ALTER SEQUENCE で変更できるパラメータ・できないパラメータの一覧
・INCREMENT BY / MINVALUE / MAXVALUE / CYCLE / CACHE / ORDER の変更例
・START WITH が変更できない場合の回避策(DROP & 再作成)
・現在値を任意の値にリセットする方法(11g以前・18c以降それぞれ対応)
・MAXVALUE の拡張で ORA-08004 を未然に防ぐ手順
・ALTER SEQUENCE に必要な権限と変更後の確認方法
スポンサーリンク

ALTER SEQUENCE の基本構文

シーケンスを変更する ALTER SEQUENCE 文の構文は以下のとおりです。変更したいパラメータだけを指定し、省略したパラメータは現在の設定が維持されます。

構文
ALTER SEQUENCE シーケンス名
    [ INCREMENT BY  n           ]  -- 増分の変更
    [ MINVALUE      n           ]  -- 最小値の変更
    [ NOMINVALUE                ]  -- 最小値制限をなくす
    [ MAXVALUE      n           ]  -- 最大値の変更
    [ NOMAXVALUE                ]  -- 最大値制限をなくす
    [ CYCLE   | NOCYCLE         ]  -- 上限到達後の動作を変更
    [ CACHE   n | NOCACHE       ]  -- キャッシュ件数の変更
    [ ORDER   | NOORDER         ]  -- 採番順序保証の変更(RAC用)
;
START WITH は ALTER SEQUENCE で変更できない
ALTER SEQUENCE シーケンス名 START WITH 100; を実行すると ORA-02765: 誤ったキーワードです エラーになります。START WITH を変更したい場合は後述の「現在値をリセット・任意の値に変更する方法」(DROP & 再作成 または RESTART オプション)を使います。

変更できるパラメータ・できないパラメータ一覧

パラメータ ALTER SEQUENCE で変更可能か 備考
INCREMENT BY ✅ 変更可 即座に反映。次の NEXTVAL から新しい増分で採番される
MINVALUE / NOMINVALUE ✅ 変更可 現在値が新 MINVALUE を下回る場合はエラー
MAXVALUE / NOMAXVALUE ✅ 変更可 上限拡張は即座に反映
CYCLE / NOCYCLE ✅ 変更可 切り替え可能
CACHE n / NOCACHE ✅ 変更可 キャッシュ変更時は現在のキャッシュが破棄される
ORDER / NOORDER ✅ 変更可 RAC環境での順序保証を変更
START WITH ❌ 変更不可 DROP & 再作成 または Oracle 18c以降の RESTART を使う
シーケンス名 ❌ 変更不可 RENAME は不可。DROP & 再作成が必要

各パラメータの変更例

INCREMENT BY(増分)を変更する

最も頻繁に変更するパラメータです。変更は即座に反映され、次の NEXTVAL から新しい増分で採番されます。

SQL(増分を1から10に変更)
ALTER SEQUENCE seq_emp
    INCREMENT BY 10;
SQL(増分を元の1に戻す)
ALTER SEQUENCE seq_emp
    INCREMENT BY 1;
INCREMENT BY の変更は「現在値をジャンプさせる」テクニックに使える
一時的に INCREMENT BY を大きな値に変更して NEXTVAL を1回呼び、その後元に戻すことで現在値を任意の値まで進める方法があります。詳細は後述の「現在値をリセット・任意の値に変更する方法」で解説します。

MAXVALUE(最大値)を変更する

シーケンスが上限に近づいている場合に拡張します。ORA-08004 エラーを防ぐ定期メンテナンスで使います。

SQL(MAXVALUE を 1億に拡張)
ALTER SEQUENCE seq_emp
    MAXVALUE 100000000;
SQL(MAXVALUE を撤廃して制限なしにする)
ALTER SEQUENCE seq_emp
    NOMAXVALUE;
MAXVALUE は現在値より大きい値にしなければならない
現在の LAST_NUMBER より小さい値を MAXVALUE に設定しようとするとORA-04009: MAXVALUEはLAST_NUMBER以上の値を指定する必要があります エラーになります。現在のシーケンス値は USER_SEQUENCES.LAST_NUMBER で確認できます。

MINVALUE(最小値)を変更する

SQL(MINVALUE を変更)
ALTER SEQUENCE seq_emp
    MINVALUE 100;
SQL(MINVALUE を撤廃する)
ALTER SEQUENCE seq_emp
    NOMINVALUE;

CYCLE / NOCYCLE を切り替える

SQL(NOCYCLE から CYCLE に変更)
ALTER SEQUENCE seq_emp
    CYCLE;
SQL(CYCLE から NOCYCLE に戻す)
ALTER SEQUENCE seq_emp
    NOCYCLE;
主キー採番に CYCLE は設定しないこと
CYCLE を有効にすると採番値が重複する可能性があります。テーブルの主キーに使っているシーケンスで CYCLE を有効にすると一意制約違反が発生します。

CACHE(キャッシュ件数)を変更する

パフォーマンス要件が変わったときや、DB 再起動による欠番を減らしたいときに変更します。

SQL(キャッシュを20から100に増やす)
ALTER SEQUENCE seq_emp
    CACHE 100;
SQL(キャッシュをなくす)
ALTER SEQUENCE seq_emp
    NOCACHE;
CACHE 変更時の注意
CACHE の値を変更すると、メモリ上にキャッシュされていた採番値は破棄されます。次の NEXTVAL 呼び出し時に新しいキャッシュサイズで先読みが再開されますが、直前にキャッシュしていた値分の欠番が発生することがあります。

複数パラメータを同時に変更する

1つの ALTER SEQUENCE 文で複数のパラメータをまとめて変更できます。

SQL(複数パラメータを同時変更)
ALTER SEQUENCE seq_emp
    INCREMENT BY 1
    MAXVALUE 999999999
    CACHE 100
    NOCYCLE;

現在値をリセット・任意の値に変更する方法

START WITHALTER SEQUENCE で変更できないため、シーケンスの現在値を特定の値に変更したい場合は以下の3つの方法があります。

方法1:DROP して再作成する(全バージョン対応)

最もシンプルで確実な方法です。依存オブジェクト(トリガーなど)がある場合は注意が必要です。

SQL(DROP して任意の値から再作成)
-- 現在のシーケンスを削除
DROP SEQUENCE seq_emp;

-- 任意の開始値で再作成
CREATE SEQUENCE seq_emp
    START WITH 1001
    INCREMENT BY 1
    NOCYCLE
    CACHE 20;
DROP 前に依存オブジェクトを確認する
シーケンスを DROP すると、そのシーケンスを参照しているトリガー・プロシージャ・ビューが無効になります。事前に USER_DEPENDENCIES で依存オブジェクトを確認してください。確認方法は【Oracle】シーケンスの確認方法完全ガイドを参照してください。

方法2:INCREMENT BY を使って現在値を任意の値にジャンプさせる(全バージョン対応)

DROP せずに現在値を変更したい場合、INCREMENT BY を一時的に変更して NEXTVAL を1回呼ぶ方法があります。

SQL(現在値を任意の値にジャンプさせる手順)
-- 【準備】現在の LAST_NUMBER と INCREMENT_BY を確認
SELECT LAST_NUMBER, INCREMENT_BY FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'SEQ_EMP';
-- 例: LAST_NUMBER=50, INCREMENT_BY=1 だったとする

-- 【手順1】目標値まで一気に進む INCREMENT BY を設定
-- 目標値を 1001 にしたい場合: 1001 - 50 - 1 = 950 を INCREMENT BY に設定
ALTER SEQUENCE seq_emp INCREMENT BY 950;

-- 【手順2】NEXTVAL を1回呼ぶ(これで現在値が 1001 になる)
SELECT seq_emp.NEXTVAL FROM DUAL;

-- 【手順3】INCREMENT BY を元の値に戻す
ALTER SEQUENCE seq_emp INCREMENT BY 1;

-- 【確認】現在値が期待通りか確認
SELECT LAST_NUMBER FROM USER_SEQUENCES WHERE SEQUENCE_NAME = 'SEQ_EMP';
計算式と具体例
INCREMENT BY に設定する値 = 目標値 - 現在の LAST_NUMBER - 元のINCREMENT_BY

【例1】現在値 50・増分 1・目標値 1001 の場合
1001 - 50 - 1 = 950 を INCREMENT BY に設定して NEXTVAL を1回呼ぶ

【例2】現在値 200・増分 1・目標値 10001 の場合
10001 - 200 - 1 = 9800 を INCREMENT BY に設定して NEXTVAL を1回呼ぶ

手順後は必ず INCREMENT BY を元の値(例: 1)に戻すこと。

方法3:RESTART オプションを使う(Oracle 18c 以降)

Oracle 18c 以降では ALTER SEQUENCE … RESTART という構文が使えます。

SQL(18c以降:RESTART で開始値に戻す)
-- シーケンスを初期状態(START WITH の値)にリセット
ALTER SEQUENCE seq_emp RESTART;

-- START WITH を指定してリセット(任意の値から再開)
ALTER SEQUENCE seq_emp RESTART START WITH 1001;
使用バージョンの確認方法
Oracle のバージョンは SELECT * FROM V$VERSION; または SELECT * FROM PRODUCT_COMPONENT_VERSION; で確認できます。詳細は【Oracle】データベースのバージョンを確認する方法を参照してください。

MAXVALUE を拡張して ORA-08004 エラーを防ぐ

長期運用のシステムでシーケンスが上限(MAXVALUE)に達すると、ORA-08004: シーケンスSEQ_EMPのNEXTVALは限界値を越えました エラーが発生してシステムが停止します。定期的に上限を監視し、余裕を持って拡張することが重要です。

SQL(上限に近いシーケンスを検出する)
SELECT
    SEQUENCE_NAME,
    LAST_NUMBER,
    MAX_VALUE,
    ROUND((LAST_NUMBER / MAX_VALUE) * 100, 2) AS used_pct
FROM USER_SEQUENCES
WHERE CYCLE_FLAG = 'N'
  AND MAX_VALUE < 9999999999999999999999999999  -- NOMAXVALUE 以外のみ
  AND ROUND((LAST_NUMBER / MAX_VALUE) * 100, 2) >= 70
ORDER BY used_pct DESC;
SQL(MAXVALUE を拡張する)
-- 現在の10倍に拡張する例
ALTER SEQUENCE seq_emp
    MAXVALUE 9999999999;

-- または上限を撤廃する
ALTER SEQUENCE seq_emp
    NOMAXVALUE;

ALTER SEQUENCE に必要な権限

対象 必要な権限
自分が所有するシーケンスを変更する なし(シーケンスのオーナーなら誰でも実行可能)
他スキーマのシーケンスを変更する ALTER ANY SEQUENCE システム権限(DBA が持つ)
SQL(権限確認)
-- 自分の権限を確認
SELECT PRIVILEGE FROM SESSION_PRIVS WHERE PRIVILEGE LIKE '%SEQUENCE%';
SQL(権限付与:DBA が実行)
GRANT ALTER ANY SEQUENCE TO 対象ユーザー名;
権限の確認・付与方法の詳細は【Oracle】ユーザ権限を確認する方法完全ガイドを参照してください。

変更後に設定を確認する

変更が正しく反映されたかを USER_SEQUENCES で確認します。

SQL(変更後の確認)
SELECT
    SEQUENCE_NAME,
    MIN_VALUE,
    MAX_VALUE,
    INCREMENT_BY,
    CYCLE_FLAG,
    CACHE_SIZE,
    LAST_NUMBER
FROM USER_SEQUENCES
WHERE SEQUENCE_NAME = 'SEQ_EMP';
シーケンスの確認方法の詳細は【Oracle】シーケンスの確認方法完全ガイドを参照してください。

よくある質問

ALTER SEQUENCE で START WITH を変更しようとしたら ORA-02765 エラーが出ました
START WITHALTER SEQUENCE では変更できません。現在値を変えたい場合は、①INCREMENT BY を一時的に変更して NEXTVAL を1回呼ぶ方法、②DROP SEQUENCE して CREATE SEQUENCE で再作成する方法、③Oracle 18c 以降なら ALTER SEQUENCE … RESTART START WITH 値 の方法があります。
変更は即座に反映されますか?実行中のトランザクションに影響しますか?
ALTER SEQUENCE はコミット不要の DDL 文です。実行した瞬間に反映され、以降の NEXTVAL から新しい設定で動作します。実行中の他のトランザクションで既にキャッシュされたシーケンス値には影響しません。
INCREMENT BY を負の値に変更できますか?
できます。ALTER SEQUENCE seq_emp INCREMENT BY -1; のように変更するとデクリメントシーケンスになります。ただし、MINVALUE の設定によっては即座に下限に達してエラーになる場合があるため、MINVALUE も同時に見直してください。
CACHE を大きくしすぎると問題が起きますか?
キャッシュ件数が大きいほど DB 再起動後の欠番が多くなります(最大 CACHE_SIZE 件の欠番が発生)。また CACHE_SIZECEIL((MAXVALUE - MINVALUE) / ABS(INCREMENT_BY)) を超えた値には設定できません。一般的には 20〜500 の範囲で調整するケースが多いです。
シーケンスを元の1から使い直したいのですが
① Oracle 18c 以降なら ALTER SEQUENCE seq_emp RESTART START WITH 1; で即座にリセットできます。
② 18c 未満の場合は DROP SEQUENCE seq_emp; してから CREATE SEQUENCE seq_emp START WITH 1 ...; で再作成します。
③ DROP なしで対処したい場合は INCREMENT BY を負の大きな値に設定して1回 NEXTVAL を呼ぶことで強制的に1近辺まで戻す方法もありますが、MINVALUE の制約に注意が必要です。
本番稼働中にシーケンスを変更しても安全ですか?
ALTER SEQUENCE は DDL のため短時間ロックが発生しますが、通常はほぼ瞬時に完了します。ただし高頻度で NEXTVAL が呼ばれている場合は一瞬の待機が発生する可能性があります。メンテナンス時間帯に実施するか、影響が小さい時間帯を選ぶことをおすすめします。
他スキーマのシーケンスを変更しようとしたら権限エラーになります
他スキーマのシーケンスを変更するには ALTER ANY SEQUENCE システム権限が必要です。DBA 権限を持つユーザーに GRANT ALTER ANY SEQUENCE TO ユーザー名; で付与してもらってください。

まとめ

ALTER SEQUENCE で変更できる項目と、できない項目の対処法をまとめます。

やりたいこと 方法
増分(INCREMENT BY)を変更する ALTER SEQUENCE … INCREMENT BY n
最大値(MAXVALUE)を拡張する ALTER SEQUENCE … MAXVALUE n または NOMAXVALUE
キャッシュ件数を変更する ALTER SEQUENCE … CACHE n または NOCACHE
CYCLE / NOCYCLE を切り替える ALTER SEQUENCE … CYCLE / NOCYCLE
開始値(START WITH)を変更する DROP & 再作成 または RESTART(18c以降)
現在値を任意の値にジャンプさせる INCREMENT BY を一時変更 → NEXTVAL 1回 → INCREMENT BY を戻す
シーケンスを1からリセットする DROP & 再作成 または RESTART START WITH 1(18c以降)

シーケンスに関連する他の操作については以下の記事も参照してください。