シーケンスとは、データベースが一定のルールに基づいて生成する自動インクリメント型の数値シーケンス番号であり、通常は等間隔の一連の数値(数値型)です。その自動インクリメント特性から、主キーや一意キーとして利用されることが多いです。
シーケンスの値取得方法
シーケンスには以下の2種類の値取得方法があります:
CURRVAL:シーケンスの現在の値を返します。NEXTVAL:シーケンスの次の自動インクリメント値を返します。
シーケンスを使用する際は、CURRVAL と NEXTVAL の前にシーケンス名を付け、ピリオド(.)で参照する必要があります。
例えば、シーケンス名が SEQ_FOO の場合、SEQ_FOO.CURRVAL を使用して SEQ_FOO シーケンスの現在の値を取得できます。同様に、SEQ_FOO.NEXTVAL を使用して SEQ_FOO シーケンスの次の自動インクリメント値を取得できます。
シーケンスの使用制限
HAVING、ORDER BY、GROUP BYなどのステートメントと同時に使用することはできません。- サブクエリ内で使用することはできません(
INSERT INTO SELECTの場合は除く)。 WHERE式に記述することはできません。
シーケンスの使用
シーケンスの CURRVAL および NEXTVAL の値は、以下の場所で使用できます:
トップレベルの
SELECTステートメントの選択リスト内。INSERTステートメントのVALUE句内。UPDATEステートメントのSET句内。
シーケンスを単独で照会する例:
SELECT SEQUENCE_NAME.NEXTVAL FROM DUAL; /*実行するたびにシーケンス番号が増加します*/
SELECT SEQUENCE_NAME.CURRVAL FROM DUAL; /*実行回数に関係なくシーケンス番号は変更されません*/
シーケンスを作成する際は、初期値とステップサイズを明確に指定する必要があります。最初に NEXTVAL を参照すると、シーケンスの初期値が返されます。その後の NEXTVAL の参照では、前回のシーケンスの返された値にシーケンス定義のステップサイズを加算した新しい値が返されます。CURRVAL を参照すると、常に現在のシーケンス値、つまり最後に NEXTVAL を参照したときに返された値が返されます。
セッション内でシーケンスの CURRVAL プセウドカラムを参照する前に、まずシーケンスの NEXTVAL プセウドカラムを適用して、このセッションのシーケンス値を初期化する必要があります。
シーケンスを作成する際は、初期値と値間の増分を定義できます。NEXTVAL を初めて参照すると、シーケンスの初期値が返されます。その後の NEXTVAL の参照では、定義された増分に従ってシーケンス値が増加し、新しい値が返されます。CURRVAL を参照すると、常にそのシーケンスの現在値、つまり最後に NEXTVAL を参照したときに返された値が返されます。シーケンスの作成と削除に関する詳細については、CREATE SEQUENCE および DROP SEQUENCE を参照してください。
例
obclient> CREATE SEQUENCE s1 START WITH 95 INCREMENT BY 1 NOORDER CACHE 10000;
Query OK, 0 rows affected
obclient> CREATE TABLE tbl1 (i INT,j INT);
Query OK, 0 rows affected
obclient> INSERT INTO tbl1 VALUES(1,70),(2,71),(3,3),(4,4);
4 rows affected
obclient> SELECT * FROM tbl1;
+---+------+
| I | J |
+---+------+
| 1 | 70 |
| 2 | 71 |
| 3 | 3 |
| 4 | 4 |
+---+------+
4 rows in set
obclient> SELECT s1.nextval, i, j FROM tbl1;
+------------+---+------+
| S1.NEXTVAL | I | J |
+------------+---+------+
| 95 | 1 | 70 |
| 96 | 2 | 71 |
| 97 | 3 | 3 |
| 98 | 4 | 4 |
+------------+---+------+
4 rows in set
obclient> SELECT s1.nextval, i, j FROM tbl1;
+------------+---+------+
| S1.NEXTVAL | I | J |
+------------+---+------+
| 99 | 1 | 70 |
| 100 | 2 | 71 |
| 101 | 3 | 3 |
| 102 | 4 | 4 |
+------------+---+------+
4 rows in set
obclient> UPDATE tbl1 SET i = s1.nextval;
Query OK, 4 rows affected
Rows matched: 4 Changed: 4 Warnings: 0
obclient> SELECT * FROM tbl1;
+-----+------+
| I | J |
+-----+------+
| 103 | 70 |
| 104 | 71 |
| 105 | 3 |
| 106 | 4 |
+-----+------+
4 rows in set
obclient> SELECT s1.currval FROM DUAL;
+---------+
| currval |
+---------+
| 106 |
+---------+
1 row in set