シーケンスとは
連番を自動的に生成して、一意の数値を払い出すスキーマオブジェクト。
主キー(サロゲートキー)の自動採番に多く使われる。
シーケンスはトランザクションの影響を受けない。NEXTVAL を呼んだ後にトランザクションをロールバックしても、その番号は再使用されず飛び番が発生する。
シーケンスの作成には CREATE SEQUENCE システム権限が必要。
シーケンスの作成
CREATE SEQUENCE <シーケンス名>
[INCREMENT BY <増分値>]
[START WITH <初期値>]
[MAXVALUE <最大値> | NOMAXVALUE]
[MINVALUE <最小値> | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE <キャッシュ数> | NOCACHE]
[ORDER | NOORDER]
[SESSION | GLOBAL];
主なオプションのデフォルト値
| オプション | デフォルト | 説明 |
|---|---|---|
| INCREMENT BY | 1 | 増分値(負の値にすると降順) |
| START WITH | 1 | 最初に返す値 |
| MAXVALUE | NOMAXVALUE(上限なし) | 最大値 |
| MINVALUE | 1(NOMINVALUE) | 最小値 |
| CYCLE / NOCYCLE | NOCYCLE(循環しない) | 最大値到達後の動作 |
| CACHE | 20(20個をキャッシュ) | メモリキャッシュ数 |
| ORDER / NOORDER | NOORDER | 払い出し順序の保証 |
| SESSION / GLOBAL | GLOBAL | スコープ(後述) |
CYCLE と NOCYCLE の動作
-
CYCLE:シーケンスの値が最大値(MAXVALUE)に達した場合、MINVALUE の値に戻って連番を再開する
-
NOCYCLE(デフォルト):最大値に達すると、その後の
NEXTVAL呼び出しはエラーになる(ORA-08004)
CACHE と NOCACHE の動作
- CACHE n(デフォルト 20):指定した数のシーケンス値をメモリにキャッシュし、データディクショナリへのアクセスを削減してパフォーマンスを向上させる
- NOCACHE:値をキャッシュしない。毎回データディクショナリにアクセスするため低速だが、番号の飛び抜けが発生しにくい
シーケンス値の取得
NEXTVAL(疑似列)
<シーケンス名>.NEXTVAL
順序を増加させて次の値を返す疑似列。
同一 SQL 文の中で NEXTVAL を複数参照しても、1行につき1回しか増加しない(同じ値が返る)。
CURRVAL(疑似列)
<シーケンス名>.CURRVAL
そのセッションで最後に取得した NEXTVAL の値を返す疑似列。
【試験の注意点】CURRVAL の使用前に NEXTVAL が必要
そのセッションで一度もNEXTVALを実行していない状態でCURRVALを参照すると、ORA-08002エラーが発生する。
CURRVAL / NEXTVAL が使用できる場所
| 使用可能 | 使用不可 |
|---|---|
| 副問合せを含まない SELECT 文の SELECT リスト | DELETE / SELECT / UPDATE 文内の副問合せ |
| INSERT の VALUES 句 | ビューの問合せ / マテリアライズドビュー |
| INSERT 内副問合せの SELECT リスト | DISTINCT を持つ SELECT 文 |
| UPDATE の SET 句 | GROUP BY / ORDER BY を持つ SELECT 文 |
| UNION / INTERSECT / MINUS による集合演算の SELECT 文 | |
| WHERE 句 | |
| CHECK 制約の条件 |
シーケンスの変更
ALTER SEQUENCE <シーケンス名>
[INCREMENT BY <増分値>]
[MAXVALUE <最大値> | NOMAXVALUE]
[MINVALUE <最小値> | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE <キャッシュ数> | NOCACHE];
- START WITH は変更できない(変更するにはシーケンスを削除して再作成する)
シーケンスの留意点
- 連番の途中で飛び番(空き)が発生することがある。原因はロールバック・インスタンス再起動・CACHE での未使用値の破棄など
- 一度払い出したシーケンス番号は、ロールバックしても再使用されない
- シーケンスはトランザクションとは独立している。
COMMIT/ROLLBACKの影響を受けず、NEXTVALを呼んだ瞬間に永続的に増加する - 複数のユーザーや複数の表で同一のシーケンスを共有できる
シーケンスの削除
DROP SEQUENCE <シーケンス名>;
セッションシーケンス(SESSION SEQUENCE)
Oracle 12c Release 1 以降で使用可能な、セッション内でのみ一意な値を払い出すシーケンス。
CREATE SEQUENCE <シーケンス名> SESSION;
- 主に一時表(TEMPORARY TABLE)の一意制約や、読取り専用データベースでの採番などに使用される
- 別のセッションが接続すると同じ値(1 など)から再開される。同一セッション内では一意だが、セッションをまたいでの一意性は保証されない
- SESSION 句を指定しない通常のシーケンスは GLOBAL SEQUENCE と呼ばれる(
GLOBALキーワードは省略可)
GLOBAL SEQUENCE と SESSION SEQUENCE の比較
| GLOBAL SEQUENCE | SESSION SEQUENCE | |
|---|---|---|
| 一意性の範囲 | データベース全体 | セッション内のみ |
| セッションをまたいだ重複 | なし | あり(別セッションで同じ値が返る) |
| 用途 | 主キーなど全体で一意な値が必要な場合 | 一時表など、セッションスコープで十分な場合 |
| パフォーマンス | 通常 | より高速 |