如何在PostgreSQL中进行数据库迁移之前将所有序列重置为1?

时间:2016-12-12 14:19:29

标签: database postgresql-9.4

(PostgreSQL 9.4)

我正在将旧数据库迁移到新架构。在使用pg_restore从我的开发机器获取新模式(没有数据)之后,我发现一些序列不是从1开始。(我在开发期间更改了多个序列以使用更高的值)。

在我开始数据库迁移之前,是否有编程方法将所有序列(其中一些不是主键)重置为1?

感谢您提供任何帮助或建议。

3 个答案:

答案 0 :(得分:6)

这对我的需求来说非常简单,SETVAL manual.在PgAdmin中,我想将序列限制为公共模式中的所有序列:

SELECT  SETVAL(c.oid, 1)
from pg_class c JOIN pg_namespace n 
on n.oid = c.relnamespace 
where c.relkind = 'S' and n.nspname = 'public'  

我发布这个作为对来这里的人的帮助。

答案 1 :(得分:3)

您可以使用循环中的setval更改seq值,在此处获取Id

中列DATA_BASE_NAME的所有表格
DO $$
DECLARE
i TEXT;
BEGIN
 FOR i IN (SELECT tb.table_name FROM information_schema.tables AS tb INNER JOIN information_schema.columns AS cols ON 
        tb.table_name = cols.table_name WHERE tb.table_catalog='DATA_BASE_NAME' 
         AND tb.table_schema='public' AND cols.column_name='Id') LOOP
         EXECUTE 'SELECT setval('||'"' || i || '_Id_seq"'||',1);';

  END LOOP;
END $$;

答案 2 :(得分:1)

您可以使用此sql代码执行此操作:

DO $$
DECLARE
i TEXT;
BEGIN
 FOR i IN (SELECT column_default FROM information_schema.columns WHERE column_default SIMILAR TO 'nextval%') 
  LOOP
         EXECUTE 'ALTER SEQUENCE'||' ' || substring(substring(i from '''[a-z_]*')from '[a-z_]+') || ' '||' RESTART 1;';    
  END LOOP;
END $$; 

我读取了列的信息,并使用正则表达式来分隔序列的名称。在我进行查询并对每个序列使用EXECUTE之后。 此代码适用于数据库的所有序列。