创建和使用序列
创建和使用序列¶
SeaboxMPP数据库序列对象是一个特殊的单行表,用作数字生成器。 您可以使用序列为添加到表中的行生成唯一的整数标识符。
声明SERIAL
类型的列会隐式创建一个序列计数器,以便在该表列中使用。
SeaboxMPP数据库提供了创建,更改和删除序列的命令。
SeaboxMPP数据库还提供内置函数来返回序列中的下一个值(nextval()
)或将序列设置为特定的起始值(setval()
)。
注意:
SeaboxMPP数据库不支持SeaboxSQLcurrval()
和lastval()
序列函数。
序列对象的属性包括序列的名称,其增量值以及序列计数器的最后,最小和最大值。
序列还有一个名为is_called
的特殊布尔属性,用于控制序列计数器上nextval()
操作的自动递增行为。
当序列的is_called
属性为true
时,nextval()
会在返回值之前递增序列计数器。
当序列的is_called
属性值为false
时,nextval()
在返回值之前不会递增计数器。
创建序列¶
CREATE SEQUENCE
命令使用给定的序列名称和可选的起始值创建和初始化序列。
序列名称必须与同一Schema中任何其他序列,表,索引或视图的名称不同。
例如:
CREATE SEQUENCE myserial START 101;
创建新序列时,SeaboxMPP数据库将序列is_called
属性设置为false
。
在新创建的序列上调用nextval()
不会递增序列计数器,但会返回序列起始值并将is_called
设置为true
。
使用序列¶
使用CREATE SEQUENCE
命令创建序列后,可以检查序列并使用序列内置函数。
- 检查序列属性
要检查序列的当前属性,请直接查询序列。 例如,要检查名为myserial
的序列:
SELECT * FROM myserial;
- 返回序列下一个值
可以调用nextval()
内置函数来返回并使用序列中的下一个值。
以下命令将名为myserial
的序列的下一个值插入名为vendors
的表的第一列:
INSERT INTO vendors VALUES (nextval('myserial'), 'acme');
nextval()
使用序列的is_called
属性值来确定在返回值之前是否递增序列计数器。当is_called
为true
时,nextval()
使计数器前进。nextval()
在返回之前将序列is_called
属性设置为true
。
nextval()
操作永远不会回滚。 即使执行nextval()
的事务失败,获取的值也会被使用。这意味着失败的事务可能会在指定值的序列中留下未使用的漏洞。
-
注意:如果在SeaboxMPP数据库中启用了镜像,则不能在
UPDATE
或DELETE
语句中使用nextval()
函数。 -
设置序列计数器值
可以使用SeaboxMPP数据库setval()
内置函数来设置序列的计数器值。
例如,以下命令将名为myserial
的序列的计数器值设置为201
:
SELECT setval('myserial', 201);
setval()
有两个函数签名:setval(sequence, start_val)
和setval(sequence,start_val, is_called)
。 setval(sequence,start_val)
的默认行为设置序列is_called
属性值为true
。
如果您不希望序列计数器在下一个nextval()
调用时递增, 请使用setval(sequence, start_val,is_called)
函数签名,传递false
参数:
SELECT setval('myserial', 201, false);
setval()
操作永远不会回滚。
修改序列¶
ALTER SEQUENCE
命令更改现有序列的属性。 您可以更改序列的开始,最小,最大和增量值。 您也可以在起始值或指定值处重新启动序列。
未在ALTER SEQUENCE
命令中设置的任何参数都保留其先前的设置。
ALTER SEQUENCE sequence START WITH start_value
将序列的start_value属性设置为新的起始值。它对last_value
属性或nextval(sequence)
函数返回的值没有影响。
ALTER SEQUENCE sequence RESTART
将序列的last_value
属性重置为start_value
属性的当前值,并将is_called
属性重置为false
。对nextval(sequence)
函数的下一次调用将返回start_value
。
ALTER SEQUENCE sequence RESTART WITH restart_value
将序列的last_value
属性设置为新值,将is_called
属性设置为false
。下一次调用nextval(sequence)
会返回restart_value
。这等效于调用setval(sequence, restart_value, false)
。
以下命令在值105
处重新启动名为myserial
的序列:
ALTER SEQUENCE myserial RESTART WITH 105;
删除序列¶
DROP SEQUENCE
命令可以删除序列。 例如,以下命令将删除名为myserial
的序列:
DROP SEQUENCE myserial;
将序列指定为列的默认值¶
除了使用SERIAL
或BIGSERIAL
类型之外, 您还可以直接在CREATE TABLE
命令中引用序列。例如:
CREATE TABLE tablename ( id INT4 DEFAULT nextval('myserial'), name text );
还可以更改表列以将其默认值设置为序列计数器:
ALTER TABLE tablename ALTER COLUMN id SET DEFAULT nextval('myserial');
序列回绕¶
默认情况下,序列不会回绕。 这意味着当一个序列到达了最大值 (SMALLSERIAL
的+32767
,SERIAL
的+2147483647
, BIGSERIAL
的+9223372036854775807
),再调用nextval()
会失败。 可以修改一个序列让它从1
开始回绕:
ALTER SEQUENCE myserial CYCLE;
也可以在创建序列时指定回绕行为:
CREATE SEQUENCE myserial CYCLE;