PostgreSql : ERROR: relation "sequence" does not exist while restoring from dump file

PostgreSql : ERROR: relation "sequence" does not exist while restoring from dump file

从服务器上的转储文件恢复数据库时出现以下错误:

ERROR: relation "table_id_seq" does not exist
LINE 1: SELECT pg_catalog.setval('table_id_seq', 362, true);

这是我的转储命令:

pg_dump -U username -h localhost db_name > filename.sql

这是我在服务器上的恢复命令:

psql -U username -h localhost db_name < filename.sql

请帮忙,谢谢。

您可以使用任何文本编辑器(记事本、Vim 等)打开转储文件。搜索 table_id_seq。你应该找到像

这样的语句
CREATE SEQUENCE table_id_seq ...

如果它丢失了,那么你的转储有一些奇怪的东西。您可以通过添加

来解决这个问题
CREATE SEQUENCE table_id_seq;

紧跟前面的语句

SELECT pg_catalog.setval('table_id_seq', 362, true);

来自错误信息。

但这只是一个技巧。你应该找出转储为什么会犯那个错误。但这需要更多信息。

在我从@clemens 获得信息并进行一些研究后,我发现,在我的 CREATE SEQUENCE table_id_seq 部分的转储文件中有一个声明 AS integer 为什么当我恢复到新数据库时它没有为序列创建 nextval()。如果我从 CREATE SEQUENCE 部分删除语句 AS integer,它会找到。

在我的转储文件中:

CREATE SEQUENCE table_id_seq
    AS integer
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

从转储文件中删除 AS integer

CREATE SEQUENCE table_id_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    NO MAXVALUE
    CACHE 1;

就我而言,序列检查区分大小写。这就是我收到关系错误的原因。所以也许它可以帮助一些像我这样最终绝望地来到这里的人。在 SQL 语句中,我在单引号内使用了双引号。

SELECT nextval('"USER_ID_seq"');

官方文档中有一些示例: https://www.postgresql.org/docs/9.1/functions-sequence.html