カテゴリ:

テーブル、ビュー、シーケンス DDL

CREATE SEQUENCE

連続した一意の番号を生成するために使用できる新しいシーケンスを作成します。

詳細については、 シーケンスの使用 をご参照ください。

こちらもご参照ください:

ALTER SEQUENCE

構文

CREATE [ OR REPLACE ] SEQUENCE [ IF NOT EXISTS ] <name>
  [ WITH ]
  [ START [ WITH ] [ = ] <initial_value> ]
  [ INCREMENT [ BY ] [ = ] <sequence_interval> ]
  [ COMMENT = '<string_literal>' ]

必須パラメーター

名前

シーケンスの識別子を指定します。シーケンスが作成されるスキーマに対して一意である必要があります。

また、識別子はアルファベット文字で始まる必要があり、識別子文字列全体が二重引用符で囲まれていない限り、スペースや特殊文字を含めることはできません(例: "My object")。二重引用符で囲まれた識別子も大文字と小文字が区別されます。

詳細については、 識別子の要件 をご参照ください。

オプションのパラメーター

START [ WITH ] [ = ] 初期値

シーケンスによって返される最初の値を指定します。サポートされる値は、64ビットの2の補数整数(-2^63 から 2^63-1 まで)で表すことができる値です。

デフォルト: 1

INCREMENT [ BY ] [ = ] シーケンス間隔

シーケンスのステップ間隔を指定します。

  • シーケンス間隔 n が正の場合、次の n-1 値は各シーケンス呼び出しによって予約されます。

  • シーケンス間隔 -n が負の場合、次に低い n-1 値が各シーケンス呼び出しによって予約されます。

サポートされる値は、64ビットの2の補数整数で表すことができる値です。 0 はシーケンス間隔として許可されていません。

デフォルト: 1

COMMENT = '文字列リテラル'

シーケンスのコメントを指定します。

デフォルト:値なし

使用上の注意

  • シーケンスの作成後には、シーケンスの最初/初期値は変更できません。

  • シーケンスは、ギャップのないシーケンスを必ずしも生成しません。値は増加し、一意です(ラップアラウンドが発生するまで)。ただし、必ずしも連続しているわけではありません。

シーケンスを使用する簡単な例を次に示します。

CREATE OR REPLACE SEQUENCE seq_01 START = 1 INCREMENT = 1;
CREATE OR REPLACE TABLE sequence_test_table (i INTEGER);
SELECT seq_01.nextval;

出力:

+---------+
| NEXTVAL |
|---------|
|       1 |
+---------+

同じクエリを再度実行します。シーケンス番号がどのように変化するかに注意してください。

SELECT seq_01.nextval;

出力:

+---------+
| NEXTVAL |
|---------|
|       2 |
+---------+

次に、テーブルに挿入するときにシーケンスを使用します。

INSERT INTO sequence_test_table (i) VALUES (seq_01.nextval);
SELECT i FROM sequence_test_table;

出力:

SELECT i FROM sequence_test_table;
+---+
| I |
|---|
| 3 |
+---+

1ではなく5ずつ増加するシーケンスを作成します。

CREATE OR REPLACE SEQUENCE seq_5 START = 1 INCREMENT = 5;
SELECT seq_5.nextval a, seq_5.nextval b, seq_5.nextval c, seq_5.nextval d;

出力:

+---+---+----+----+
| A | B |  C |  D |
|---+---+----+----|
| 1 | 6 | 11 | 16 |
+---+---+----+----+

同じクエリを再度実行します。シーケンス番号がどのように変化するかに注意してください。次の一連のシーケンス番号は、前のステートメントが中断したときよりも5高く始まると予想されるかもしれません。ただし、次のシーケンス番号は20から始まります(5 * 4、5は増分のサイズ、4はステートメント内の NEXTVAL 操作の数):

SELECT seq_5.nextval a, seq_5.nextval b, seq_5.nextval c, seq_5.nextval d;

出力:

+----+----+----+----+
|  A |  B |  C |  D |
|----+----+----+----|
| 36 | 41 | 46 | 51 |
+----+----+----+----+

この例は、列のデフォルト値としてシーケンスを使用して、テーブルの各行に一意の識別子を提供できることを示しています。

CREATE OR REPLACE SEQUENCE seq90;
CREATE OR REPLACE TABLE sequence_demo (i INTEGER DEFAULT seq90.nextval, dummy SMALLINT);
INSERT INTO sequence_demo (dummy) VALUES (0);

-- Keep doubling the number of rows:
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
INSERT INTO sequence_demo (dummy) SELECT dummy FROM sequence_demo;
SELECT i FROM sequence_demo ORDER BY i LIMIT 10;

出力:

SELECT i FROM sequence_demo ORDER BY i LIMIT 10;
+----+
|  I |
|----|
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
|  7 |
|  8 |
|  9 |
| 10 |
+----+

これは、すべての行に個別の値があることを示しています。

SELECT COUNT(i), COUNT(DISTINCT i), MIN(i), MAX(i) FROM sequence_demo;

出力:

SELECT COUNT(i), COUNT(DISTINCT i), MIN(i), MAX(i) FROM sequence_demo;
+----------+-------------------+--------+--------+
| COUNT(I) | COUNT(DISTINCT I) | MIN(I) | MAX(I) |
|----------+-------------------+--------+--------|
|     1024 |              1024 |      1 |   1024 |
+----------+-------------------+--------+--------+

その他の例は シーケンスの使用 にあります。