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 |
---|---|
CYCLE 或 NO CYCLE |
CYCLE 选项允许序列在达到 maxvalue 或 minvalue 时分别通过升序或降序序列进行循环。如果达到限制,生成的下一个数字将分别是 minvalue 或 maxvalue 。如果指定了 NO CYCLE ,则在序列达到其最大值后对 nextval 的任何调用都将返回错误。如果未指定 CYCLE 或 NO 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 。 |
TEMPORARY 或 TEMP |
如果指定,序列对象仅为此会话创建,并在会话退出时自动删除。在临时序列存在期间,具有相同名称的现有永久序列在此会话中不可见,除非使用模式限定名称引用它们。 |
序列基于
BIGINT
算术,因此范围不能超过八字节整数的范围(-9223372036854775808到9223372036854775807)。