【问题标题】:pg_get_serial_sequence returns ERROR: column "---" of relation "---" does not existpg_get_serial_sequence 返回错误:关系“---”的列“---”不存在
【发布时间】:2019-12-12 16:54:58
【问题描述】:

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

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_ID 的插入不会与 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 语句正在纠正表的顺序,但它不适用于所有表,并且不适用于这个简化的情况。

【问题讨论】:

    标签: postgresql postgresql-11


    【解决方案1】:

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

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

    所以表名必须用双引号,用单引号括起来。

    【讨论】:

    • 100 年后我永远都猜不到这一点。
    【解决方案2】:

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

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

    有效!

    【讨论】:

      猜你喜欢
      • 2012-12-20
      • 1970-01-01
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多