创建和使用命名序列

使用 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)

在表中引用序列

表可以将任何列的默认值设置为命名序列。表创建者必须具有以下权限: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)