PostgreSql:错误:关系"序列"从转储文件还原时不存在

时间:2018-03-19 04:58:03

标签: postgresql postgresql-9.6 pg-dump postgresql-10

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

  

错误:关系" table_id_seq"不存在   第1行:SELECT pg_catalog.setval(' table_id_seq',362,true);

  • 我的本地psql版本是10.2
  • 服务器psql版本是9.6.8

这是我的转储命令:

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

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

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

请帮助,谢谢。

3 个答案:

答案 0 :(得分:10)

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

在我的转储文件中:

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;

答案 1 :(得分:1)

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

这样的陈述
CREATE SEQUENCE table_id_seq ...

如果缺少那么你的转储就会有些奇怪。你可以通过添加

来解决这个问题
CREATE SEQUENCE table_id_seq;

立即在声明前面

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

来自错误消息。

但这只是一个黑客。你应该找出转储造成错误的原因。但这需要更多信息。

答案 2 :(得分:1)

就我而言,序列检查区分大小写。这就是为什么我会得到释放错误。因此,这也许可以帮助像我这样绝望于此的一些人。在SQL语句中,我在单引号内使用了双引号。

SELECT nextval('"USER_ID_seq"');

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