Postgresql查询以获取序列元数据

5 浏览
0 Comments

Postgresql查询以获取序列元数据

我正在寻找一个查询,可以提供序列的完整元数据。当我在控制台使用下面的查询时,我得到了元数据。

\d+ phonebook_id_seq
           序列 "public.phonebook_id_seq"
    列名     |  类型   |        值        | 存储
---------------+---------+---------------------+---------
 sequence_name | name    | phonebook_id_seq    | plain
 last_value    | bigint  | 2                   | plain
 start_value   | bigint  | 1                   | plain
 increment_by  | bigint  | 1                   | plain
 max_value     | bigint  | 9223372036854775807 | plain
 min_value     | bigint  | 1                   | plain
 cache_value   | bigint  | 1                   | plain
 log_cnt       | bigint  | 31                  | plain
 is_cycled     | boolean | f                   | plain
 is_called     | boolean | t                   | plain

我正在寻找一个能够提供相同输出的查询。我尝试了下面的查询,但是没有得到与上述完整的元数据信息相同的结果。

我尝试了这个查询:

SELECT * 
FROM information_schema.sequences 
WHERE sequence_name = 'phonebook_id_seq';

输出:

enter image description here

'postgres','public','phonebook_id_seq','bigint',64,2,0,'1','1','9223372036854775807','1','NO'

0
0 Comments

从上面的内容中可以看出,问题的出现的原因是在不同版本的PostgreSQL中获取序列元数据的方法不同。在10版本之前,可以通过直接查询序列名来获取序列元数据,例如select * from phonebook_id_seq。而在10版本及之后的版本中,需要使用pg_sequence表来获取序列元数据,例如select * from pg_sequence where seqrelid='phonebook_id_seq'::regclass;

解决方法是根据不同的版本选择对应的查询语句来获取序列元数据。对于10版本之前的旧版本,使用select * from phonebook_id_seq来获取序列元数据;对于10版本及之后的版本,使用select * from pg_sequence where seqrelid='phonebook_id_seq'::regclass;来获取序列元数据。

此外,还可以参考https://www.postgresql.org/docs/current/static/app-psql.html中关于psql命令的说明,通过设置-E参数来查看实际生成的查询语句,以便研究psql的内部操作。这相当于将变量ECHO_HIDDEN设置为on

根据不同的PostgreSQL版本选择相应的查询语句来获取序列元数据,并可以通过设置-E参数来查看实际生成的查询语句。

0