pg_get_serial_sequence返回错误:关系"---"的列"---"不存在



使用 Postgres 11.5,我尝试手动将一些数据(具有特定键值(插入到具有串行主键字段的表中,然后调整串行主键字段的顺序以返回高于当前最大值的值。但是我收到一个错误。这是一个简单的表格

CREATE TABLE FOO (
FOO_ID SERIAL PRIMARY KEY,
VAL     INTEGER
);
INSERT INTO FOO (VAL) VALUES (4);
SELECT * FROM FOO;
-- returns one record with a FOO_ID of 1, as expected
INSERT INTO FOO (FOO_ID, VAL) VALUES (5, 5);
SELECT * FROM FOO WHERE VAL=5;
-- returns one record with a FOO_ID of 5, as expected

接下来,我想更新序列,以便我接下来的几个没有显式FOO_IDs的插入不会与 ID 为 5 的插入发生冲突:

SELECT setval(pg_get_serial_sequence('FOO', 'FOO_ID'), (SELECT COALESCE(MAX(FOO_ID), 0) FROM FOO));

但是上述SQL的这一部分失败了:

SELECT pg_get_serial_sequence('FOO', 'FOO_ID');

出现此错误: 错误:关系"foo"的列"FOO_ID"不存在 SQL 状态:42703

我做错了什么,还是有更好的方法可以做到这一点? 可能值得注意的是,我确实有一些表,我的 setval 语句正在纠正表的顺序,但它不适用于所有表,也不适用于这种简化的情况。

就我而言,问题是一样的,但解决方案略有不同。我希望我的回答能帮助其他人。表名的小写没有帮助,因为应用程序使用的第一个字符大写的表名(Foo而不是foo(。在 2004 年的一封电子邮件(链接(中,我得到了正确的提示:

SELECT PG_GET_SERIAL_SEQUENCE('"Foo"', 'Foo_id');

因此,表名必须用双引号引起来,用单引号括起来。

我刚刚发现这是一个区分大小写的问题。

SELECT pg_get_serial_sequence('foo', 'foo_id');

工程!

相关内容

  • 没有找到相关文章

最新更新