【问题标题】:Issue updating sequences问题更新序列
【发布时间】:2022-10-24 09:42:37
【问题描述】:

我想更新 RDS Postgres 11 中表的序列。尝试了以下命令,但我没有看到提交给数据库的更改。我什至使用了commit
我错过了什么?

1.   SELECT setval(pg_get_serial_sequence('table1', 'id'), coalesce(max(id),0) + 1, false) FROM table1;

2.   SELECT setval('table1_id_seq', (SELECT COALESCE(max(id), 0) + 1 FROM table1));
     ALTER TABLE table1 ALTER COLUMN id SET DEFAULT nextval('table1_id_seq');
CREATE TABLE public.table1 (
    id serial4 NOT NULL, --default nextval('table1_id_seq'::regclass)  
    account_id int4 NOT NULL, 
    CONSTRAINT table1_pkey PRIMARY KEY (id) );

select currval('table1_id_seq') 返回6

【问题讨论】:

  • 我没有看到您如何使用pg_get_serial_sequence 为尚未设置序列的列获取序列? pg_get_serial_sequence 仅适用于由列“拥有”的序列。在您的问题中添加table1 的表定义。
  • CREATE TABLE public.table1 ( id serial4 NOT NULL, --default nextval('table1_id_seq'::regclass) --select currval('table_id_seq')=6 account_id int4 NOT NULL, CONSTRAINT table1_pkey PRIMARY KEY (id), );
  • 请完整阅读 cmets。我继续按照我的要求将表定义添加到问题中。在任何情况下,您都会遇到复制/粘贴问题或命名问题。您将序列称为table1_id_seqtable_id_seq
  • @AdrianKlaver 它的错字。更新了问题。
  • 我无法重现。在您的问题中添加来自select * from table1_id_seq ; 的结果。同样来自select max(id) from table1;

标签: database postgresql amazon-rds auto-increment


【解决方案1】:

如果你 ...

看不到提交给数据库的更改

...即使您积极地提交了事务(并且您连接到正确的数据库),那么我只看到两种可能的解释。

1. 找错树

在您的问题中,public.table1CREATE TABLE 语句中是模式限定的,但在以下任何一个中都没有:

SELECT setval(pg_get_serial_sequence('table1', 'id'), ...
SELECT setval('table1_id_seq', ...

如果在search_path 中的“public”之前的另一个模式中有另一个table1,则最终会修改该表的相应序列。

由于 Postgres 中的出厂默认值为 search_path = "$user",public,因此明显的怀疑是当前角色的“home”模式中的同名表。看:

解决方案:
修复搜索路径或模式限定表和序列名称。

2.缺少特权

假设您的数据库角色在table1 上拥有SELECT(甚至全部)权限应该是安全的。但是您需要对底层SEQUENCE 具有单独的额外权限才能在其上运行setval()

不过,您应该会看到缺少权限的错误消息!
看:

解决方案:

GRANT USAGE ON SEQUENCE table1_id_seq TO the_role;  -- your role here

或者使用IDENTITY 列而不是serial(Postgres 10+),它隐式地继承了表的权限。看:

【讨论】:

  • 谢谢你。解决方案 1 是我的解决方案。我更新了目标数据库中所有其他表的序列。但是,对于某些表,序列“last_value”与源表中的完全不同。我可以使用 setval 函数修复它,但首先想知道为什么会有这种差异。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-17
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多