適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
シーケンス オブジェクトを作成し、そのプロパティを指定します。 シーケンスは、シーケンスが作成された仕様に従って数値のシーケンスを生成するユーザー定義のスキーマ バインド オブジェクトです。 数値のシーケンスは、定義された間隔で昇順または降順に生成され、要求に応じて再起動 (繰り返し) するように構成できます。
シーケンスは、ID 列とは異なり、特定のテーブルに関連付けられません。 アプリケーションは、シーケンス オブジェクトを参照して、次の値を受け取ります。 シーケンスとテーブルの関係は、アプリケーションによって制御されます。 ユーザー アプリケーションは、シーケンス オブジェクトを参照し、複数の行とテーブル間で値を調整できます。
行の挿入時に生成される ID 列の値とは異なり、アプリケーションは NEXT VALUE FOR を呼び出すことによって、行を挿入せずに次のシーケンス番号を取得できます。 一度に複数のシーケンス番号を取得するには、 sp_sequence_get_range を使用します。
CREATE SEQUENCEとNEXT VALUE FOR関数の両方を使用するシナリオについては、「シーケンス番号」を参照してください。
構文
CREATE SEQUENCE [ schema_name . ] sequence_name
[ AS [ built_in_integer_type | user-defined_integer_type ] ]
[ START WITH <constant> ]
[ INCREMENT BY <constant> ]
[ { MINVALUE [ <constant> ] } | { NO MINVALUE } ]
[ { MAXVALUE [ <constant> ] } | { NO MAXVALUE } ]
[ CYCLE | { NO CYCLE } ]
[ { CACHE [ <constant> ] } | { NO CACHE } ]
[ ; ]
引数
sequence_name
データベースに認識されるシーケンスの一意な名前を指定します。 データ型は sysname です。
[ built_in_integer_type | user-defined_integer_type ]
シーケンスを任意の整数型として定義できます。 次の型を使用できます。
- tinyint - 0 ~ 255 の範囲
- smallint - -32,768 ~ 32,767 の範囲
- int - -2,147,483,648 ~ 2,147,483,647 の範囲
- bigint - -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807 の範囲
- 小数点以下のない decimal と numeric。
- 許可される型のいずれかに基づくユーザー定義データ型 (別名型)。
データ型が指定されていない場合は、bigint データ型が既定で使用されます。
START WITH <constant>
シーケンス オブジェクトによって返される最初の値。
START値は、シーケンス オブジェクトの最大値以下の値、およびシーケンス オブジェクトの最小値以上である必要があります。 新しいシーケンス オブジェクトの既定の開始値は、昇順のシーケンス オブジェクトの最小値および降順のシーケンス オブジェクトの最大値です。
INCREMENT BY <constant>
NEXT VALUE FOR関数の呼び出しごとにシーケンス オブジェクトの値をインクリメント (負の場合はデクリメント) するために使用される値。 増分が負の値の場合、シーケンス オブジェクトは降順になります。それ以外の場合は昇順です。 増分を 0 にすることはできません。 新しいシーケンス オブジェクトの既定の増分値は 1 です。
[ MINVALUE <constant> |NO MINVALUE ]
シーケンス オブジェクトの境界を指定します。 新しいシーケンス オブジェクトの既定の最小値は、シーケンス オブジェクトのデータ型の最小値です。 これは、0 を tinyint データ型およびその他のすべてのデータ型の負の数。
[ MAXVALUE <constant> |NO MAXVALUE
シーケンス オブジェクトの境界を指定します。 新しいシーケンス オブジェクトの既定の最大値は、シーケンス オブジェクトのデータ型の最大値です。
[ CYCLE |NO CYCLE ]
最小値または最大値を超過した場合に、シーケンス オブジェクトを最小値 (または降順シーケンス オブジェクトの最大値) から再起動するか、例外をスローするかを指定するプロパティ。 新しいシーケンス オブジェクトの既定のサイクル オプションは NO CYCLE。
Note
SEQUENCEを循環すると、開始値ではなく最小値または最大値から再起動します。
[ CACHE [ <constant> ] |NO CACHE ]
シーケンス番号を生成するのに必要なディスク IO の数を最小限に抑えることで、シーケンス オブジェクトを使用するアプリケーションのパフォーマンスが向上します。 既定値は CACHE です。
たとえば、キャッシュ サイズが 50 の場合、SQL Server では 50 個の個別の値はキャッシュされません。 現在の値とキャッシュに残されている値の量のみがキャッシュされます。 これは、キャッシュを格納するために必要なメモリの量は、常にシーケンス オブジェクトのデータ型の 2 つのインスタンスと等しくなることを意味します。
Note
キャッシュ サイズを指定せずにキャッシュ オプションが有効になっている場合、データベース エンジンはサイズを選択します。 ただし、ユーザーは選択内容の一貫性に依存しないでください。 Microsoft は、予告なしにキャッシュ サイズの計算方法を変更する場合があります。
CACHE オプションを使用して作成すると、予期しないシャットダウン (電源障害など) によって、キャッシュに残っているシーケンス番号が失われる可能性があります。
注釈
シーケンス番号は、現在のトランザクションの範囲外で生成されます。 シーケンス番号を使用するトランザクションがコミットされるかロールバックされるかに関係なく、使用されます。 重複の検証は、レコードが完全に設定された後にのみ実行されます。 このため、いくつかのケースでは作成中に同じ番号が複数のレコードに使用されますが、その後重複していると識別されることになります。 このようになったときに他の autonumber 値が後に続くレコードに適用された場合、autonumber 値の間にギャップが生じることがありますが、これは想定されている動作です。
キャッシュ管理
パフォーマンスを向上させるために、SQL Server では、 CACHE 引数で指定されたシーケンス番号の数が事前に割り当てられます。
たとえば、新しいシーケンスは開始値 1 とキャッシュ サイズ 15 で作成されます。 最初の値が必要な場合は、メモリから 1 から 15 の値を使用します。 最後にキャッシュされた値 (15) は、ディスクのシステム テーブルに書き込まれます。 15 の数値をすべて使用している場合は、次の要求 (16) でキャッシュを再度割り当てます。 新しい最後にキャッシュされた値 (30) がシステム テーブルに書き込まれます。
22 個の番号を使用した後でデータベース エンジンが停止する場合は、メモリ (23) 内にある次のシーケンス番号がシステム テーブルに書き込まれ、以前に格納された数字を上書きします。
SQL Server が再起動し、シーケンス番号が必要な場合、開始番号はシステム テーブル (23) から読み取られます。 15 の数 (23 から 38) のキャッシュ量がメモリに割り当てられ、次の非キャッシュ番号 (39) がシステム テーブルに書き込まれます。
データベース エンジンが電源障害などのイベントで異常停止した場合、シーケンスはシステム テーブル (39) から読み取られた数で再起動されます。 メモリに割り当てられたシーケンス番号 (ただし、ユーザーやアプリケーションから要求されていないもの) は失われます。 この機能はギャップを残す可能性がありますが、 CYCLE として定義されているか、手動で再起動されない限り、1 つのシーケンス オブジェクトに対して同じ値が 2 回発行されることはありません。
キャッシュは、現在の値 (最後に発行された値) とキャッシュに残された値の量を追跡することによってメモリ内に保持されます。 したがって、キャッシュによって使用されるメモリの量は、常にシーケンス オブジェクトのデータ型の 2 つのインスタンスと等しくなります。
キャッシュ引数を NO CACHE に設定すると、シーケンスが使用されるたびに、現在のシーケンス値がシステム テーブルに書き込まれます。 これにより、ディスク アクセスが増えてパフォーマンスが低下する場合がありますが、意図しないギャップが発生する可能性は低減されます。
NEXT VALUE FOR関数またはsp_sequence_get_range関数を使用して数値が要求された場合でも、数値が使用されないか、コミットされていないトランザクションで使用されている場合は、ギャップが発生する可能性があります。
シーケンス オブジェクトで CACHE オプションを使用する場合、シーケンス オブジェクトを再起動するか、 INCREMENT、 CYCLE、 MINVALUE、 MAXVALUE、キャッシュ サイズのプロパティを変更すると、変更が発生する前にキャッシュがシステム テーブルに書き込まれます。 その後、現在の値からキャッシュが再読み込みされます (つまり、数値はスキップされません)。 キャッシュ サイズを変更すると、即座に反映されます。
キャッシュされた値が使用可能な場合の CACHE オプション
シーケンス オブジェクトのメモリ内キャッシュで使用できる未使用の値がある場合、シーケンス オブジェクトが CACHE オプションの次の値を生成するように要求されるたびに、次のプロセスが発生します。
- シーケンス オブジェクトの次の値が計算される。
- シーケンス オブジェクトの新しい現在の値は、メモリ内で更新される。
- 計算された値は、呼び出し元のステートメントに返される。
キャッシュが使い果たされたときの CACHE オプション
キャッシュが使い果たされた場合、 CACHE オプションの次の値を生成するようにシーケンス オブジェクトが要求されるたびに、次のプロセスが発生します。
シーケンス オブジェクトの次の値が計算される。
新しいキャッシュの最後の値が計算される。
シーケンス オブジェクトのシステム テーブル行がロックされ、手順 2. (最後の値) で計算された値がシステム テーブルに書き込まれる。 キャッシュ不足の拡張イベントが発生し、新しい永続化された値がユーザーに通知されます。
NO CACHE オプション
次のプロセスは、シーケンス オブジェクトが NO CACHE オプションの次の値を生成するように要求されるたびに発生します。
- シーケンス オブジェクトの次の値が計算される。
- シーケンス オブジェクトの新しい現在の値は、システム テーブルに書き込まれる。
- 計算された値は、呼び出し元のステートメントに返される。
Metadata
シーケンスの詳細については、「 sys.sequences」を参照してください。
セキュリティ
アクセス許可
SCHEMAに対するCREATE SEQUENCE、ALTER、またはCONTROLアクセス許可が必要です。
- db_ownerおよびdb_ddladmin固定データベース ロールのメンバーは、シーケンス オブジェクトを作成、変更、および削除できます。
- db_ownerおよびdb_datawriter固定データベース ロールのメンバーは、シーケンス オブジェクトを更新して数値を生成できます。
次の例では、Test スキーマにシーケンスを作成するアクセス許可をユーザーAdventureWorks\Larry付与します。
GRANT CREATE SEQUENCE
ON SCHEMA::Test TO [AdventureWorks\Larry];
シーケンス オブジェクトの所有権は、 ALTER AUTHORIZATION ステートメントを使用して転送できます。
シーケンスでユーザー定義データ型を使用する場合、シーケンスの作成者には、その型に対する REFERENCES 権限が必要です。
Audit
CREATE SEQUENCEを監査するには、SCHEMA_OBJECT_CHANGE_GROUPを監視します。
例
シーケンスを作成し、 NEXT VALUE FOR 関数を使用してシーケンス番号を生成する例については、「 シーケンス番号」を参照してください。
ほとんどの次の例では、テストをという名前のスキーマでシーケンス オブジェクトを作成します。
テストのスキーマを作成するには、次のステートメントを実行します。
CREATE SCHEMA Test;
GO
A. 1 ずつ増加するシーケンスを作成する
次の例では、Thierry によって CountBy1 という名前のシーケンスが作成され、使用されるたびに 1 ずつ増加します。
CREATE SEQUENCE Test.CountBy1
START WITH 1
INCREMENT BY 1;
GO
B. 1 ずつ減少するシーケンスを作成する
次の例では、0 から始まり、使用されるたびに 1 ずつ負の数にカウントされます。
CREATE SEQUENCE Test.CountByNeg1
START WITH 0
INCREMENT BY -1;
GO
C. 5 ずつ増加するシーケンスを作成する
次の例では、使用するたびに 5 ずつ増加するシーケンスを作成します。
CREATE SEQUENCE Test.CountBy1
START WITH 5
INCREMENT BY 5;
GO
D. 指定された番号で始まるシーケンスを作成する
テーブルをインポートした後、Thierry は最上位の ID 番号が 24,328 であることに気付きます。 Thierry には、24,329 から始まる数値を生成するシーケンスが必要です。 次のコードは 24,329 で始まり、1 ずつ増加するシーケンスを作成します。
CREATE SEQUENCE Test.ID_Seq
START WITH 24329
INCREMENT BY 1;
GO
E. 既定値を使用してシーケンスを作成する
次の例では、既定値を使用して、シーケンスを作成します。
CREATE SEQUENCE Test.TestSequence;
次のステートメントを実行して、シーケンスのプロパティを確認します。
SELECT *
FROM sys.sequences
WHERE name = 'TestSequence';
出力の一覧の一部は、既定値を示します。
| 出力 | 既定値 |
|---|---|
start_value |
-9223372036854775808 |
increment |
1 |
minimum_value |
-9223372036854775808 |
maximum_value |
9223372036854775807 |
is_cycling |
0 |
is_cached |
1 |
current_value |
-9223372036854775808 |
F. 特定のデータ型を持つシーケンスを作成する
次の例では、-32,768 ~ 32,767 の範囲の smallint データ型を使用して、シーケンスを作成します。
CREATE SEQUENCE SmallSeq
AS SMALLINT;
G. すべての引数を使用してシーケンスを作成する
次の例では、0 ~ 255 の範囲の smallint データ型を使用して、DecSeq という名前のシーケンスを作成します。 シーケンスは 125 で始まり、数値が生成されるたびに 25 ずつ増加します。 シーケンスは、値が最大値の 200 を超える場合は繰り返すように設定されているため、最小値の 100 で再起動します。
CREATE SEQUENCE Test.DecSeq
AS DECIMAL (3, 0)
START WITH 125
INCREMENT BY 25
MINVALUE 100
MAXVALUE 200
CYCLE
CACHE 3;
次のステートメントを実行して、最初の値、つまり START WITH オプションが 125であることを確認します。
SELECT NEXT VALUE FOR Test.DecSeq;
150、175、200 を返すように、ステートメントを 3 回実行します。
ステートメントを再度実行し、開始値が MINVALUE オプション (100) に戻ることを確認します。
次のコードを実行して、キャッシュ サイズを確認し、現在の値を表示します。
SELECT cache_size, current_value
FROM sys.sequences
WHERE name = 'DecSeq';