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用)
;
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 から新しい増分で採番されます。
ALTER SEQUENCE seq_emp
INCREMENT BY 10;
ALTER SEQUENCE seq_emp
INCREMENT BY 1;
一時的に
INCREMENT BY を大きな値に変更して NEXTVAL を1回呼び、その後元に戻すことで現在値を任意の値まで進める方法があります。詳細は後述の「現在値をリセット・任意の値に変更する方法」で解説します。MAXVALUE(最大値)を変更する
シーケンスが上限に近づいている場合に拡張します。ORA-08004 エラーを防ぐ定期メンテナンスで使います。
ALTER SEQUENCE seq_emp
MAXVALUE 100000000;
ALTER SEQUENCE seq_emp
NOMAXVALUE;
現在の
LAST_NUMBER より小さい値を MAXVALUE に設定しようとするとORA-04009: MAXVALUEはLAST_NUMBER以上の値を指定する必要があります エラーになります。現在のシーケンス値は USER_SEQUENCES.LAST_NUMBER で確認できます。MINVALUE(最小値)を変更する
ALTER SEQUENCE seq_emp
MINVALUE 100;
ALTER SEQUENCE seq_emp
NOMINVALUE;
CYCLE / NOCYCLE を切り替える
ALTER SEQUENCE seq_emp
CYCLE;
ALTER SEQUENCE seq_emp
NOCYCLE;
CYCLE を有効にすると採番値が重複する可能性があります。テーブルの主キーに使っているシーケンスで CYCLE を有効にすると一意制約違反が発生します。
CACHE(キャッシュ件数)を変更する
パフォーマンス要件が変わったときや、DB 再起動による欠番を減らしたいときに変更します。
ALTER SEQUENCE seq_emp
CACHE 100;
ALTER SEQUENCE seq_emp
NOCACHE;
CACHE の値を変更すると、メモリ上にキャッシュされていた採番値は破棄されます。次の NEXTVAL 呼び出し時に新しいキャッシュサイズで先読みが再開されますが、直前にキャッシュしていた値分の欠番が発生することがあります。
複数パラメータを同時に変更する
1つの ALTER SEQUENCE 文で複数のパラメータをまとめて変更できます。
ALTER SEQUENCE seq_emp
INCREMENT BY 1
MAXVALUE 999999999
CACHE 100
NOCYCLE;
現在値をリセット・任意の値に変更する方法
START WITH は ALTER SEQUENCE で変更できないため、シーケンスの現在値を特定の値に変更したい場合は以下の3つの方法があります。
方法1:DROP して再作成する(全バージョン対応)
最もシンプルで確実な方法です。依存オブジェクト(トリガーなど)がある場合は注意が必要です。
-- 現在のシーケンスを削除
DROP SEQUENCE seq_emp;
-- 任意の開始値で再作成
CREATE SEQUENCE seq_emp
START WITH 1001
INCREMENT BY 1
NOCYCLE
CACHE 20;
シーケンスを DROP すると、そのシーケンスを参照しているトリガー・プロシージャ・ビューが無効になります。事前に
USER_DEPENDENCIES で依存オブジェクトを確認してください。確認方法は【Oracle】シーケンスの確認方法完全ガイドを参照してください。方法2:INCREMENT BY を使って現在値を任意の値にジャンプさせる(全バージョン対応)
DROP せずに現在値を変更したい場合、INCREMENT BY を一時的に変更して NEXTVAL を1回呼ぶ方法があります。
-- 【準備】現在の 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 という構文が使えます。
-- シーケンスを初期状態(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は限界値を越えました エラーが発生してシステムが停止します。定期的に上限を監視し、余裕を持って拡張することが重要です。
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;
-- 現在の10倍に拡張する例
ALTER SEQUENCE seq_emp
MAXVALUE 9999999999;
-- または上限を撤廃する
ALTER SEQUENCE seq_emp
NOMAXVALUE;
ALTER SEQUENCE に必要な権限
| 対象 | 必要な権限 |
|---|---|
| 自分が所有するシーケンスを変更する | なし(シーケンスのオーナーなら誰でも実行可能) |
| 他スキーマのシーケンスを変更する | ALTER ANY SEQUENCE システム権限(DBA が持つ) |
-- 自分の権限を確認 SELECT PRIVILEGE FROM SESSION_PRIVS WHERE PRIVILEGE LIKE '%SEQUENCE%';
GRANT ALTER ANY SEQUENCE TO 対象ユーザー名;
変更後に設定を確認する
変更が正しく反映されたかを USER_SEQUENCES で確認します。
SELECT
SEQUENCE_NAME,
MIN_VALUE,
MAX_VALUE,
INCREMENT_BY,
CYCLE_FLAG,
CACHE_SIZE,
LAST_NUMBER
FROM USER_SEQUENCES
WHERE SEQUENCE_NAME = 'SEQ_EMP';
よくある質問
START WITH は ALTER SEQUENCE では変更できません。現在値を変えたい場合は、①INCREMENT BY を一時的に変更して NEXTVAL を1回呼ぶ方法、②DROP SEQUENCE して CREATE SEQUENCE で再作成する方法、③Oracle 18c 以降なら ALTER SEQUENCE … RESTART START WITH 値 の方法があります。ALTER SEQUENCE はコミット不要の DDL 文です。実行した瞬間に反映され、以降の NEXTVAL から新しい設定で動作します。実行中の他のトランザクションで既にキャッシュされたシーケンス値には影響しません。ALTER SEQUENCE seq_emp INCREMENT BY -1; のように変更するとデクリメントシーケンスになります。ただし、MINVALUE の設定によっては即座に下限に達してエラーになる場合があるため、MINVALUE も同時に見直してください。CACHE_SIZE は CEIL((MAXVALUE - MINVALUE) / ABS(INCREMENT_BY)) を超えた値には設定できません。一般的には 20〜500 の範囲で調整するケースが多いです。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以降) |
シーケンスに関連する他の操作については以下の記事も参照してください。

