为什么 "setval()" 失败并显示 "relation ... does not exist"?

8
如果您尝试像这样设置序列号:
SELECT setval('table_ID_seq', (SELECT max("ID") + 1 FROM table));

您可能会遇到以下错误:
ERROR:  relation "table_ID_seq" does not exist
LINE 1: SELECT setval('table_ID_seq', (SELECT max("ID") + 1 FROM t...
                      ^

********** Error **********

ERROR: relation "table_id_seq" does not exist
SQL Status:42P01
2个回答

25

问题在于,PostgreSQL会对标识符名称进行规范化处理,除非将它们放在双引号中。

然而,以下方式不起作用:

SELECT setval("table_ID_seq", (SELECT max("ID") + 1 FROM table));

相反,你需要在双引号文本周围加上单引号:

SELECT setval('"table_ID_seq"', (SELECT max("ID") + 1 FROM table));

虽然这肯定在文档中有提到,但可能并不是那么明显。谢谢! - Ian Bytchek
7
回家吧,Postgres,你喝醉了 :) - Richard Marr
1
我花了3个小时才弄明白到底是怎么回事...你救了我的一天。 - Konrad
谢谢!这节省了我很多时间。 - Shankar Naru
你让我的一天变得美好!我很幸运,在仅仅一天之后就找到了你的解决方案。非常感谢你。 - kevin.jalais
哇!Postgres 一定是在开玩笑。这个可行。 - Marco Polo

1

在尝试了所有之前的提示后,错误仍然存在。我确认需要将数值转换为整数。

需要强制返回整数。

select setval ('YOUR_ID_SEQ', (select cast (max (YOUR_COLUMN) as integer) from YOUR_TABLE));

这是因为你在这里没有使用 + 1 吗?加上 1 是必要的,以避免重复使用相同的数字并避免将 0 作为第一个 ID(基于 1 的 ID)。 - Arc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接