创建和使用序列
Greenplum数据库序列对象是一个特殊的单行表,用作数字生成器。 您可以使用序列为添加到表中的行生成唯一的整数标识符。 声明SERIAL类型的列会隐式创建一个序列计数器,以便在该表列中使用。
Greenplum数据库提供了创建,更改和删除序列的命令。 Greenplum数据库还提供内置函数来返回序列中的下一个值(nextval())或将序列设置为特定的起始值(setval())。
Note: Greenplum数据库不支持PostgreSQLcurrval()和lastval()序列函数。
序列对象的属性包括序列的名称,其增量值以及序列计数器的最后,最小和最大值。 序列还有一个名为is_called的特殊布尔属性,用于控制序列计数器上nextval()操作的自动递增行为。 当序列的is_called属性为true时,nextval()会在返回值之前递增序列计数器。 当序列的is_called属性值为false时,nextval()在返回值之前不会递增计数器。
Parent topic: 定义数据库对象
创建一个序列
CREATE SEQUENCE命令使用给定的序列名称和可选的起始值创建和初始化序列。 序列名称必须与同一Schema中任何其他序列,表,索引或视图的名称不同。 例如:
CREATE SEQUENCE myserial START 101;
创建新序列时,Greenplum数据库将序列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()的事务失败,获取的值也会被使用。 这意味着失败的事务可能会在指定值的序列中留下未使用的漏洞。
Note: 如果在Greenplum数据库中启用了镜像,则不能在UPDATE或DELETE语句中使用nextval()函数。
设置序列计数器值
您可以使用Greenplum数据库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;