3

我在 postgres 中创建了序列。

postgres=# create sequence my_sequence start 5 minvalue 3 increment 1 cycle;
CREATE SEQUENCE

现在我正在尝试从序列中查询下一个值。

postgres=# select nextval("my_sequence");
ERROR:  column "my_sequence" does not exist
LINE 1: select nextval("my_sequence");

但这给了我错误,该序列不存在。但是,当我在 sequence_name 中使用单引号时,它可以正常工作:-

postgres=# select nextval('my_sequence');
 nextval
---------
       5
(1 row)

但是根据sql 中单引号和双引号之间的区别,双引号可以与任何用户定义的 sql 对象一起使用。因此,因此 my_sequence 也是用户定义的对象。那么,为什么我无法访问它?

4

1 回答 1

3

TL;DR:使用单引号,例如 in

SELECT nextval('my_sequence');

to 的参数nextval不是标识符,但具有类型regclass

\df nextval
                       List of functions
   Schema   |  Name   | Result data type | Argument data types |  Type  
------------+---------+------------------+---------------------+--------
 pg_catalog | nextval | bigint           | regclass            | normal
(1 row)

regclass是一种便利类型,在内部与无符号的 4 字节对象标识符 type 相同oid,但具有接受表、索引或序列名称作为输入的类型输入函数。

所以你可以nextval用表作为参数调用,字符串用单引号而不是双引号括起来。

于 2018-03-29T12:32:30.513 回答