pg_get_serial_sequence 不返回任何内容(空字符串)

pet*_*rov 7 sql postgresql

我有很多带有 auto-inc PK 的表,并且对于它们中的大多数pg_get_serial_sequence返回(正如我所期望的)auto-inc 后面的序列名称,即 SERIAL PK。但是对于一个表pg_get_serial_sequence只返回一个空字符串?!

现在......我为这些表生成了 CREATE 脚本,但我没有看到这些表的创建脚本之间的任何原则差异(那些pg_get_serial_sequence工作正常的表,以及它不起作用的表,即它返回一个空字符串)。

两者都有由某些序列支持的 SERIAL PK 列。所以情况对我来说似乎相同。然而,对于我的一个表pg_get_serial_sequence不返回该支持序列的名称,它只返回空字符串。

这个特定的表可能缺少什么?

我需要做一些特别的事情来将给定的序列设置为 SERIAL 序列吗?!

如果没有,我应该寻找什么?我错过了什么?

kli*_*lin 10

这取决于表的创建方式。使用 时serial,会自动创建序列并与表关联:

create table my_table_auto(id serial);
select pg_get_serial_sequence('my_table_auto', 'id');

   pg_get_serial_sequence    
-----------------------------
 public.my_table_auto_id_seq
(1 row) 
Run Code Online (Sandbox Code Playgroud)

手动创建序列时,它与表没有关联:

create sequence my_sequence;
create table my_table_manually(id int default nextval('my_sequence'));
select pg_get_serial_sequence('my_table_manually', 'id');

 pg_get_serial_sequence 
------------------------

(1 row)
Run Code Online (Sandbox Code Playgroud)

您可以更改序列以将其与表相关联:

alter sequence my_sequence owned by my_table_manually.id;
select pg_get_serial_sequence('my_table_manually', 'id');

 pg_get_serial_sequence 
------------------------
 public.my_sequence
(1 row) 
Run Code Online (Sandbox Code Playgroud)