创建和使用命名序列
使用
CREATE SEQUENCE
创建命名序列。该语句只需提供序列名称即可;所有其他参数均为可选参数。要创建序列,用户必须对包含该序列的架构具有 CREATE 权限。
以下示例将创建一个起始值为 100 的升序命名序列 my_seq
:
=> CREATE SEQUENCE my_seq START 100;
CREATE SEQUENCE
递增和递减序列
在创建命名序列对象时,还可以通过设置其 INCREMENT
参数指定其递增量或递减量值。如果省略此参数(如上一示例中所示),则默认值设置为 1。
可以通过对序列调用函数
NEXTVAL
来递增或递减序列(直接在序列本身上递增或递减,或通过向引用该序列的表中添加新行来间接地递增或递减)。对新序列第一次调用时,NEXTVAL
将该序列初始化为其起始值。Vertica 还会为序列创建缓存。随后对序列调用 NEXTVAL
会递增其值。
下面对 NEXTVAL
的调用会将新 my_seq
序列初始化为 100:
=> SELECT NEXTVAL('my_seq');
nextval
---------
100
(1 row)
获取序列的当前值
可以通过对序列调用
CURRVAL
来获取该序列的当前值。例如:
=> SELECT CURRVAL('my_seq');
CURRVAL
---------
100
(1 row)
注意
CURRVAL
在以下情况下将返回错误:如果对尚未由 NEXTVAL
初始化的新序列或对尚未在新会话中访问的现有序列调用它。例如:
=> CREATE SEQUENCE seq2;
CREATE SEQUENCE
=> SELECT currval('seq2');
ERROR 4700: Sequence seq2 has not been accessed in the session
在表中引用序列
表可以将任何列的默认值设置为命名序列。表创建者必须具有以下权限:SELECT(对于序列)、USAGE(对于其架构)。
在以下示例中,列 id
从命名序列 my_seq
获取其默认值:
=> CREATE TABLE customer(id INTEGER DEFAULT my_seq.NEXTVAL,
lname VARCHAR(25),
fname VARCHAR(25),
membership_card INTEGER
);
对于插入到表 customer
中的每一行,该序列调用 NEXTVAL
函数来设置 id
列的值。例如:
=> INSERT INTO customer VALUES (default, 'Carr', 'Mary', 87432);
=> INSERT INTO customer VALUES (default, 'Diem', 'Nga', 87433);
=> COMMIT;
对于每一行,插入操作都会对序列 my_seq
调用 NEXTVAL
,这会将该序列递增至 101 和 102,并将 id
列设置为这些值:
=> SELECT * FROM customer;
id | lname | fname | membership_card
-----+-------+-------+-----------------
101 | Carr | Mary | 87432
102 | Diem | Nga | 87433
(1 row)