创建和使用序列
用户可以使用序列在为一个表增加记录时自动增加唯一的ID列值。序列常常被用来为加入到表中的行分配唯一的标识号。用户可以把一个标识符列声明为类型SERIAL以隐式地创建一个用于该列的序列。
上级主题: 定义数据库对象
创建一个序列
CREATE SEQUENCE 命令用给定的序列名称创建并且初始化一个特殊的单行序列生成器表。序列名称必须和同一个方案中任何其他序列、表、索引或者视图的名称不同。例如:
CREATE SEQUENCE myserial START 101;
使用一个序列
在使用CREATE SEQUENCE创建了一个序列生成器表之后,用户可以使用nextval函数来操作该序列。例如,要向表中插入一个得到序列中下个值的行:
INSERT INTO vendors VALUES (nextval('myserial'), 'acme');
用户还可以用setval函数来重置一个序列的计数器值。例如:
SELECT setval('myserial', 201);
一次nextval操作永不会被回滚。一个被取出的值被认为是已经用掉,即便执行nextval的事务失败也是如此。这意味着失败的事务可能在该序列的已分配值中留下未使用的空洞。 setval操作也永不会被回滚。
注意如果启用了镜像,在UPDATE或DELETE语句中不允许使用nextval函数。在Greenplum数据库中不支持函数 currval和。
为了检查一个序列的当前设置,可查询该序列表:
SELECT * FROM myserial;
修改一个序列
ALTER SEQUENCE命令可更改一个现有序列生成器的参数。例如:
ALTER SEQUENCE myserial RESTART WITH 105;
任何在ALTER SEQUENCE命令中没有设置的参数会保持它们之前的设置。
删除一个序列
DROP SEQUENCE命令移除一个序列生成器表。例如:
DROP SEQUENCE myserial;
让一个序列成为一个列的默认值
一个序列可以被用在CREATE TABLE命令中(取代 SERIAL或者BIGSERIAL类型):
CREATE TABLE ... (
id INT4 DEFAULT nextval('id_seq')
);
或者,可以修改列让序列作为默认值:
ALTER TABLE ... ALTER COLUMN id SET DEFAULT nextval('id_seq');