CREATE SEQUENCE
目的
順序は一意の整数の生成に使用されるデータベース・オブジェクトで、一般的に表内の合成主キー列に移入するために使用されます。順序番号は、通常は1ずつ増え、新しい各エントリは索引の右端のリーフ・ブロックに配置されます。
CREATE
SEQUENCE
文を使用して、主キー値を自動的に生成する順序を作成します。
順序番号が生成されると、順序はトランザクションのコミットやロールバックとは無関係に増加していきます。2人のユーザーが、同時に同一の順序を増加させると、ユーザーがそれぞれ順序番号を生成しているため、取得する順序番号間に違いが発生することもあります。他のユーザーが生成した順序番号は取得できません。あるユーザーが順序値を生成すると、他のユーザーがその順序を増加させたかどうかに関係なく、順序を生成したユーザーは引き続きその値にアクセスできます。
順序番号は表とは関係なく生成されるため、1つ以上の表に対して同一の順序を使用できます。順序番号が生成および使用されるトランザクションが最終的にロールバックされた場合、個々の順序番号が連続していないように見える場合があります。また、他のユーザーが同一順序を使用していることを個々のユーザーが認識しない場合もあります。
順序が作成されると、SQL文の中でCURRVAL
疑似列を使用してその値にアクセスできます(この場合、その順序の現在の値が戻ります)。また、NEXTVAL
疑似列を使用してもアクセスできます(この場合は、順序が増加され、新しい値が戻ります)。
関連項目:
-
CURRVAL
およびNEXTVAL
の使用方法の詳細は、「疑似列」を参照してください。 -
順序の使用方法の詳細は、「順序値の使用方法」を参照してください。
-
順序の変更または削除の詳細は、「ALTER SEQUENCE」または「DROP SEQUENCE」を参照してください。
前提条件
自分のスキーマ内に順序を作成する場合は、CREATE
SEQUENCE
システム権限が必要です。
他のユーザーのスキーマ内に順序を作成する場合は、CREATE
ANY
SEQUENCE
システム権限が必要です。
構文
create_sequence::=
セマンティクス
IF NOT EXISTS
IF NOT EXISTS
を指定すると、次の効果が得られます。
-
順序が存在していない場合は、文の最後に新しい順序が作成されます。
-
順序が存在している場合、これは文の最後の時点にある順序になります。古いものが検出されるため、新しいものは作成されません。
IF EXISTS
はCREATE
とともに使用すると、ORA-11543: Incorrect IF NOT EXISTS clause for CREATE statement
が発生します。
schema
順序を含めるスキーマを指定します。schema
を省略した場合、自分のスキーマ内に順序が作成されます。
sequence
作成する順序の名前を指定します。名前は、「データベース・オブジェクトのネーミング規則」に指定されている要件を満たしている必要があります。
INCREMENT
BY
からGLOBAL
までの句のうちどれも指定しない場合は、1から始まる昇順の順序が作成され、上限なしで1ずつ増加していきます。INCREMENT
BY
-1のみを指定した場合は、-1から始まる降順の順序が作成され、下限なしで1ずつ減少していきます。
-
昇順で、無制限に増加する順序を作成する場合は、
MAXVALUE
パラメータを省略するか、NOMAXVALUE
を指定します。降順の場合は、MINVALUE
パラメータを省略するか、またはNOMINVALUE
を指定します。 -
昇順で、事前に定義した制限で停止する順序を作成する場合は、
MAXVALUE
パラメータに値を指定します。降順の場合は、MINVALUE
パラメータの値を指定します。NOCYCLE
も指定します。順序が制限に達したときに順序番号をさらに生成しようとした場合、エラーが発生します。 -
事前に定義した制限に達した後で初期値に戻る順序を作成する場合は、
MAXVALUE
パラメータとMINVALUE
パラメータの両方に値を指定します。CYCLE
も指定します。
SHARING
この句は、アプリケーション・ルートに順序を作成する場合にのみ適用されます。このタイプの順序はアプリケーション共通オブジェクトと呼ばれ、アプリケーション・ルートに属するアプリケーションPDBと共有できます。順序の共有方法を決定するには、次の共有属性のいずれかを指定します。
-
METADATA
- メタデータ・リンクは順序のメタデータを共有しますが、そのデータは各コンテナに固有です。このタイプの順序は、メタデータリンク・アプリケーション共通オブジェクトと呼ばれます。 -
DATA
- データ・リンクは順序を共有し、そのデータはアプリケーション・コンテナ内のすべてのコンテナに対して同じです。そのデータはアプリケーション・ルートにのみ格納されます。このタイプの順序は、データリンク・アプリケーション共通オブジェクトと呼ばれます。 -
NONE
- 順序は共有されません。
この句を省略した場合、データベースはDEFAULT_SHARING
初期化パラメータの値を使用して、順序の共有属性を決定します。DEFAULT_SHARING
初期化パラメータに値が含まれていない場合、デフォルトはMETADATA
です。
順序を作成した後、その共有属性を変更することはできません。
関連項目:
-
DEFAULT_SHARING
初期化パラメータの詳細は、Oracle Databaseリファレンスを参照してください -
アプリケーション共通オブジェクトの作成の詳細は、『Oracle Database管理者ガイド』を参照してください。
INCREMENT BY
順序の番号間の増分間隔を指定します。この値は、0(ゼロ)以外の正の整数または負の整数になります。この値には、昇順の場合は28桁以内、降順の場合は27桁以内の値を指定できます。この値の絶対値は、MAXVALUE
とMINVALUE
の差未満である必要があります。この値が負の場合、順序は降順になります。この値が正の場合、順序は昇順になります。この句を省略した場合、デフォルトで増分間隔は1に設定されます。
START WITH
生成する順序番号の初期値を指定します。この句を指定した場合、順序の最小値より大きい値を初期値として昇順を開始することも、最大値よりも小さい値を初期値として降順を開始することもできます。昇順の場合、デフォルト値は順序の最小値になります。降順の場合、デフォルト値は順序の最大値になります。正の値の場合は28桁以内、負の値の場合は27桁以内の値を指定できます。
ノート:
この値は、必ずしも、順序の最大値または最小値にそれぞれ達した後に、昇順または降順で循環する順序が戻るときの値ではありません。
MAXVALUE
順序が生成できる最大値を指定します。正の値の場合は28桁以内、負の値の場合は27桁以内の値を指定できます。MAXVALUE
値は、START
WITH
以上で、かつMINVALUE
を超える値である必要があります。
MINVALUE
順序の最小値を指定します。正の値の場合は28桁以内、負の値の場合は27桁以内の値を指定できます。MINVALUE
値は、START
WITH
以下で、かつMAXVALUE
未満である必要があります。
CYCLE
CYCLE
を指定すると、順序が最大値または最小値に達した後、引き続き値が生成されます。つまり、昇順の場合は、最大値に達すると最小値が生成されます。降順の場合は、最小値に達すると最大値が生成されます。
CACHE
より高速にアクセスできるように、データベースがメモリーに事前に割り当て、保持しておく順序の値の数を指定します。28桁以内の整数値を指定できます。このパラメータの最小値は2です。循環する順序の場合、この値は、そのサイクル内で生成される値の数未満である必要があります。指定したサイクル内で生成される順序番号の数を超える値はキャッシュできません。したがって、CACHE
に指定できる値の最大値は、次の式で求められる値未満である必要があります。
CEIL ( (MAXVALUE - MINVALUE) / ABS (INCREMENT) )
システム障害が発生すると、キャッシュされた順序の値のうち、コミットされたDML文で使用されていなかったものはすべて失われます。したがって、失われる可能性がある値の数は、CACHE
パラメータの値と等しくなります。
ノート:
Oracle Real Application Clusters環境で順序を使用する場合は、パフォーマンスを向上するために、CACHE
の設定を使用することをお薦めします。
ORDER
ORDER
を指定すると、要求どおりの順序で順序番号を生成することを保証できます。順序番号をタイムスタンプとして使用する場合に、この句は有効です。通常、主キー生成用の順序については、順序どおりに生成するかどうかの保証は重要ではありません。
KEEP
アプリケーション・コンティニュイティのための再実行中に、NEXTVAL
が元の値を保持するようにするには、KEEP
を指定します。この動作は、アプリケーションを実行しているユーザーが、順序を含むスキーマの所有者である場合にのみ行われます。この句は、リカバリ可能なエラー後の再実行でバインド変数の一貫性を保持するために役立ちます。アプリケーション・コンティニュイティの詳細は、『Oracle Database開発ガイド』を参照してください。
NOKEEP
アプリケーション・コンティニュイティのための再実行中に、NEXTVAL
が元の値を保持しないようにするには、NOKEEP
を指定します。これはデフォルトです。
ノート:
KEEP
句とNOKEEP
句は、順序を含むスキーマの所有者にのみ適用されます。アプリケーション・コンティニュイティのための再実行中に、その他のユーザーの元の値をNEXTVAL
で維持するかどうかは、順序に対するKEEP
SEQUENCE
オブジェクト権限を付与または取消しすることで制御できます。KEEP
SEQUENCE
オブジェクト権限の詳細は、「表18-4」を参照してください。
SCALE
SCALE
を使用して、スケーラブルな順序を作成します。スケーラブルな順序は、順序に5桁の接頭辞を追加します。接頭辞は、次のように3桁のセッション・オフセットに連結された2桁のインスタンス・オフセットで構成されます。
[(instance id % 100) ] || [session id % 1000]
最後の順序番号はprefix || zero-padding || sequence
の書式で、穴埋めの量は順序の最大幅によって異なります。
リリース23より前のスケーラブル順序では、インスタンス・オフセットの一部として先頭に1が付きます。
SELECT mysequence.nextval FROM DUAL; NEXTVAL ---------- 101213001
リリース23では、この同じスケーラブル順序で、インスタンス・オフセットの先頭1が削除されます。
SELECT mysequence.nextval FROM DUAL; NEXTVAL ---------- 1213001
ノート:
Oracle Databaseリリース23以降、新しく作成されたスケーラブル順序では、インスタンス・オフセットの先頭1が削除されます。リリース23より前に作成されたスケーラブル順序では、インスタンス・オフセットの先頭の'1'が保持されます。
SCALE
を使用する場合は、順序に対してORDER
を同時に使用しないことをお薦めします。
EXTEND
EXTEND
をSCALE
とともに指定すると、順序番号が最大長にゼロで埋められ、次に接頭辞が連結されるため、最終順序番号はMAXVALUE
設定より6桁多くなります。
NOEXTEND
SCALE
句のデフォルト設定はNOEXTEND
です。NOEXTEND
が設定されていると、生成される順序値の幅は最大でも順序内の数字の最大数MAXVALUE
です。
NOEXTEND
は、SCALE
句のデフォルト設定です。NOEXTEND
が設定されていると、生成される順序値の幅は最大でも順序内の数字の最大数(maxvalue/minvalue)
です。この設定は、固定幅の列を移入するために順序が使用される、既存のアプリケーションとの統合に役立ちます。
NOSCALE
順序のデフォルト属性はNOSCALE
ですが、順序のスケーラビリティを無効にするために明示的に指定することもできます。
SHARD
SHARD
句のセマンティクスの詳細は、ALTER SEQUENCE文のSHARD
句を参照してください。
SESSION
SESSION
を指定すると、セッションの順序を作成できます。この順序は、セッションから認識できるグローバル一時表に使用することを具体的に指定する特種な順序です。既存の通常の順序(対比のために「グローバルな」順序と呼びます)とは異なり、セッションの順序は、複数のセッション全体ではなく、1つのセッションに限定された順序番号の一意の範囲を返します。また、セッションの順序は永続されない点も異なります。セッションが失われると、そのセッション中にアクセスされるセッションの順序も失われます。
セッションの順序は、読取り/書込みデータベースで作成する必要がありますが、読取り/書込みデータベースまたは読取り専用の任意のデータベース(一時的に読取り専用でオープンされた通常のデータベース、またはスタンバイ・データベース)からアクセスできます。
CACHE
句、NOCACHE
句、ORDER
句、またはNOORDER
句は、SESSION
句と同時に指定すると無視されます。
関連項目:
セッション順序の詳細は、『Oracle Data Guard概要および管理』を参照してください。
例
順序の作成: 例
次の文は、サンプル・スキーマoe
に順序customers_seq
を作成します。この順序は、customers
表に行が追加されるときに、顧客ID番号として使用できます。
CREATE SEQUENCE customers_seq START WITH 1000 INCREMENT BY 1 NOCACHE NOCYCLE;
最初にcustomers_seq.nextval
を参照したときは、1000が戻されます。次に参照したときは、1001が戻されます。同様に、この後の各参照で、前回参照された値より1大きい値が戻されます。