首页 > 解决方案 > PostgreSQL 不同步时如何重置所有表的主键序列?

问题描述

通过 Postico 或其他工具导入数据库后,表的 ID 序列不同步。

我知道我可以通过运行来解决这个问题

SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), (SELECT MAX(id) FROM table_name)+1);

但是我将如何为所有表执行此操作,而不必为每个表运行相同的命令?

标签: postgresql

解决方案


我实际上已经找到了答案。

创建一个reset.sql以此为内容的文件:

SELECT 'SELECT SETVAL(' ||
       quote_literal(quote_ident(PGT.schemaname) || '.' || quote_ident(S.relname)) ||
       ', COALESCE(MAX(' ||quote_ident(C.attname)|| '), 1) ) FROM ' ||
       quote_ident(PGT.schemaname)|| '.'||quote_ident(T.relname)|| ';'
FROM pg_class AS S,
     pg_depend AS D,
     pg_class AS T,
     pg_attribute AS C,
     pg_tables AS PGT
WHERE S.relkind = 'S'
    AND S.oid = D.objid
    AND D.refobjid = T.oid
    AND D.refobjid = C.attrelid
    AND D.refobjsubid = C.attnum
    AND T.relname = PGT.tablename
ORDER BY S.relname;

将此文件运行为

psql -h yourdb.yourhost.com -U mysecretuser -Atq -f reset.sql -o temp

然后运行输出为

psql -h yourdb.yourhost.com -U mysecretuser -f temp

最后

rm temp

推荐阅读