⌘+k ctrl+k
1.1.3 (stable)
Search Shortcut cmd + k | ctrl + k
CREATE SEQUENCE Statement

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

Examples

生成一个从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 你好
2 世界

序列也可以通过使用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;
当前值
1

Syntax

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

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

序列创建后,您可以使用函数nextval来操作序列。

Parameters

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

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