跳到主要内容

序列伪列

序列(Sequence)是数据库按照一定规则生成的自增数字序列号,通常是一组等间隔的数值(为数字类型)。因其自增的特性,通常被用作主键和唯一键。

序列的取值方法

序列有如下两种取值方法:

  • CURRVAL:返回序列的当前值。

  • NEXTVAL:返回序列的下一个自增值。

使用序列时,必须在 CURRVALNEXTVAL 前带上序列的名称,并用句点(.)引用。

例如,序列的名称为 SEQ_FOO,则可以通过 SEQ_FOO.CURRVAL 获取 SEQ_FOO 序列的当前值。同样,可以通过 SEQ_FOO.NEXTVAL 获取 SEQ_FOO 序列的下一个自增值。

序列的使用限制

  • 不能与 HAVINGORDER BYGROUP BY 等语句同时使用。
  • 不能在子查询中出现(INSERT INTO SELECT 的情况除外)。
  • 不能出现在 WHERE 表达式中。

序列的使用

序列 CURRVALNEXTVAL 的值可以用于以下位置:

  • 顶层 SELECT 语句的选择列表中。

  • INSERT 语句中的 VALUE 子句中。

  • UPDATE 语句中的 SET 子句中。

单独使用查询 Sequence 的示例如下:

SELECT SEQUENCE_NAME.NEXTVAL FROM DUAL;      /*每执行一次 Sequence 号就会增加*/

SELECT SEQUENCE_NAME.CURRVAL FROM DUAL; /*执行多少次 Sequence 号都不会变化*/

创建序列时,需要明确其初始值和步长。第一次引用 NEXTVAL 将返回序列的初始值,后续对 NEXTVAL 的引用将按照上一次序列的返回值加上序列定义的步长后返回一个新值。任何时候对 CURRVAL 的引用,都将返回当前序列的值,即最后一次对 NEXTVAL 引用时返回的值。

在会话中引用序列的 CURRVAL 伪列前,都应首先应用序列的 NEXTVAL 伪列来初始化本次会话的序列值。

创建序列时,可以定义其初始值以及其值之间的增量。对 NEXTVAL 的第一次引用将返回序列的初始值。对 NEXTVAL 的后续引用将会使序列值按照定义的增量递增,并返回新值。任何对 CURRVAL 的引用总是返回该序列的当前值,即最后一次对 NEXTVAL 引用时返回的值。对序列的创建和删除的相关内容,请参见 CREATE SEQUENCEDROP SEQUENCE

示例

CREATE SEQUENCE s1 START WITH 95 INCREMENT BY 1 NOORDER CACHE 10000;
Query OK, 0 rows affected (0.001 sec)

CREATE TABLE tbl1 (i INT,j INT);
Query OK, 0 rows affected (0.001 sec)

INSERT INTO tbl1 VALUES(1,70),(2,71),(3,3),(4,4);
4 rows affected (0.003 sec)

SELECT * FROM tbl1;
+---+------+
| I | J |
+---+------+
| 1 | 70 |
| 2 | 71 |
| 3 | 3 |
| 4 | 4 |
+---+------+
4 rows in set (0.003 sec)

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 (0.003 sec)

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 (0.003 sec)

UPDATE tbl1 SET i = s1.nextval;
Query OK, 4 rows affected (0.003 sec)
Rows matched: 4 Changed: 4 Warnings: 0

SELECT * FROM tbl1;
+-----+------+
| I | J |
+-----+------+
| 103 | 70 |
| 104 | 71 |
| 105 | 3 |
| 106 | 4 |
+-----+------+
4 rows in set (0.003 sec)

SELECT s1.currval FROM DUAL;
+---------+
| currval |
+---------+
| 106 |
+---------+
1 row in set (0.001 sec)