从服务器上的转储文件恢复数据库时出现以下错误:
错误:关系" table_id_seq"不存在 第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
请帮助,谢谢。
答案 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