シーケンス(Sequence)とは、データベースが一定のルールに従って生成する自動インクリメントの数値シーケンス番号であり、通常は等間隔の一連の数値(数値型)です。その自動インクリメントの特性から、主キーや一意キーとして使用されることが一般的です。
シーケンスの値の取得方法
シーケンスには以下の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