postgresql - PostgreSQL 不同步时如何重置所有表的主键序列?
问题描述
通过 Postico 或其他工具导入数据库后,表的 ID 序列不同步。
我知道我可以通过运行来解决这个问题
SELECT pg_catalog.setval(pg_get_serial_sequence('table_name', 'id'), (SELECT MAX(id) FROM table_name)+1);
但是我将如何为所有表执行此操作,而不必为每个表运行相同的命令?
解决方案
我实际上已经找到了答案。
创建一个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
推荐阅读
- java - java.lang.NoClassDefFoundError: org.slf4j.helpers.MessageFormatter
- aframe - 在 VR 模式下更改相机配置(fov、userHeight、方向)
- python - 我想在 python 中创建任务来更新文本文件
- django - serializer.save() 不保存在 django rest
- java - Pyspark:java.lang.OutOfMemoryError:将数据帧保存到 parquet/csv 时的 Java 堆空间
- javascript - 如何在作为javascript表单的codeigniter中编写支付表单的源标记代码
- shell - 在文件名具有“SPACE”和特殊字符的卸妆服务器上存档文件
- javascript - 替换字符串的第一个和最后一个字符
- javascript - ExpressionChangedAfterItHasBeenCheckedError Angular7
- mysql - 从同一张表中查询两个具有不同关系的键