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)。