⌘+k ctrl+k
1.3 (稳定版)
搜索快捷键 cmd + k | ctrl + k
CREATE SEQUENCE 语句

CREATE SEQUENCE 语句用于创建新的序列号生成器。

示例

生成从 1 开始的升序序列

CREATE SEQUENCE serial;

从给定起始数字生成序列

CREATE SEQUENCE serial START 101;

使用 INCREMENT BY 生成奇数

CREATE SEQUENCE serial START WITH 1 INCREMENT BY 2;

生成从 99 开始的降序序列

CREATE SEQUENCE serial START WITH 99 INCREMENT BY -1 MAXVALUE 99;

默认情况下,不允许循环,否则将导致错误,例如:

Sequence Error:
nextval: reached maximum value of sequence "serial" (10)
CREATE SEQUENCE serial START WITH 1 MAXVALUE 10;

CYCLE 允许重复循环相同的序列

CREATE SEQUENCE serial START WITH 1 MAXVALUE 10 CYCLE;

创建和删除序列

序列的创建和删除方式与其他目录项类似。

覆盖现有序列

CREATE OR REPLACE SEQUENCE serial;

仅当序列尚不存在时才创建

CREATE SEQUENCE IF NOT EXISTS serial;

删除序列

DROP SEQUENCE serial;

如果序列存在则删除

DROP SEQUENCE IF EXISTS serial;

将序列用于主键

序列可以为表提供整数主键。例如:

CREATE SEQUENCE id_sequence START 1;
CREATE TABLE tbl (id INTEGER DEFAULT nextval('id_sequence'), s VARCHAR);
INSERT INTO tbl (s) VALUES ('hello'), ('world');
SELECT * FROM tbl;

该脚本生成以下表格

id s
1 hello
2 world

序列也可以使用 ALTER TABLE 语句添加。以下示例添加了一个 id 列,并用序列生成的值填充它

CREATE TABLE tbl (s VARCHAR);
INSERT INTO tbl VALUES ('hello'), ('world');
CREATE SEQUENCE id_sequence START 1;
ALTER TABLE tbl ADD COLUMN id INTEGER DEFAULT nextval('id_sequence');
SELECT * FROM tbl;

此脚本生成与上一个示例相同的表格。

选择下一个值

要从序列中选择下一个数字,请使用 nextval

CREATE SEQUENCE serial START 1;
SELECT nextval('serial') AS nextval;
nextval
1

INSERT 命令中使用此序列

INSERT INTO distributors VALUES (nextval('serial'), 'nothing');

选择当前值

您也可以查看序列的当前数字。请注意,在调用 currval 之前必须已经调用过 nextval 函数,否则会抛出序列化错误(sequence is not yet defined in this session)。

CREATE SEQUENCE serial START 1;
SELECT nextval('serial') AS nextval;
SELECT currval('serial') AS currval;
currval
1

语法

CREATE SEQUENCE 创建一个新的序列号生成器。

如果给定模式名称,则在指定模式中创建序列。否则,它将在当前模式中创建。临时序列存在于特殊模式中,因此在创建临时序列时可能不提供模式名称。序列名称必须与同一模式中任何其他序列的名称不同。

创建序列后,使用函数 nextval 对序列进行操作。

参数

名称 描述
CYCLENO CYCLE CYCLE 选项允许序列在升序或降序序列分别达到 maxvalueminvalue 时进行回绕。如果达到限制,生成的下一个数字将分别是 minvaluemaxvalue。如果指定 NO CYCLE,则序列达到其最大值后对 nextval 的任何调用都将返回错误。如果既未指定 CYCLE 也未指定 NO CYCLE,则默认值为 NO CYCLE
增量 可选子句 INCREMENT BY increment 指定添加到当前序列值以创建新值的值。正值将生成升序序列,负值将生成降序序列。默认值为 1。
最大值 可选子句 MAXVALUE maxvalue 确定序列的最大值。如果未提供此子句或指定了 NO MAXVALUE,则将使用默认值。升序序列的默认值分别为 2^63 - 1 和 -1(对于降序序列)。
最小值 可选子句 MINVALUE minvalue 确定序列可以生成的最小值。如果未提供此子句或指定了 NO MINVALUE,则将使用默认值。升序序列的默认值分别为 1 和 -(2^63 - 1)(对于降序序列)。
名称 要创建的序列的名称(可选地可使用模式限定)。
起始值 可选子句 START WITH start 允许序列从任意位置开始。升序序列的默认起始值为 minvalue,降序序列的默认起始值为 maxvalue
TEMPORARYTEMP 如果指定,序列对象仅为当前会话创建,并在会话退出时自动删除。在临时序列存在期间,同名的现有永久序列不可见(在此会话中),除非它们使用模式限定名称引用。

序列基于 BIGINT 算术,因此其范围不能超过八字节整数的范围(-9223372036854775808 到 9223372036854775807)。

限制

由于 DuckDB 依赖管理器的限制,DROP SEQUENCE 在某些特殊情况下会失败。例如,删除使用序列的列应该允许序列被删除,但目前这会返回错误

CREATE SEQUENCE id_sequence START 1;
CREATE TABLE tbl (id INTEGER DEFAULT nextval('id_sequence'), s VARCHAR);

ALTER TABLE tbl DROP COLUMN id;
DROP SEQUENCE id_sequence;
Dependency Error:
Cannot drop entry "id_sequence" because there are entries that depend on it.
table "tbl" depends on index "id_sequence".
Use DROP...CASCADE to drop all dependents.

这可以通过使用 CASCADE 修饰符来解决。以下命令会删除序列

DROP SEQUENCE id_sequence CASCADE;