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

时间:2019-12-12 16:54:58

标签: postgresql postgresql-11

使用Postgres 11.5,我尝试将一些数据(具有特定键值)手动插入到具有SERIAL PRIMARY KEY字段的表中,然后调整SERIAL主键字段的顺序以返回大于当前的最大值。但是我遇到了错误。这是一张简单的桌子

[[0, 564, 1688], [1, 778, 1650], ...]

接下来,我想更新序列,以便接下来的几个没有显式FOO_ID的插入不会与ID为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

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

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

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

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

2 个答案:

答案 0 :(得分:0)

我刚刚发现了它区分大小写的问题。

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

有效!

答案 1 :(得分:0)

就我而言,问题是相同的,但是解决方案略有不同。希望我的回答对别人有帮助。表名的小写字母无济于事,因为应用程序使用第一个字符大写的表名(Foo而不是foo)。在2004年的一封电子邮件(link)中,我得到了正确的提示:

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

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