2016-02-27 39 views
1

更新序列我需要不同的系统上更新更多然后26 tables序列如何动态地在PostgreSQL

现在我做SELECT setval('auth_group_id_seq', max(id)) FROM auth_group;每个表。

不过是他们的一种方式,我可以提供每个表遍历在\dt public.*,然后更新序列。

我认为做这样的事情,但有错误,而不是select table_name from tables where tables IN (\dt public.*);

+0

我们不能合并这两个查询? –

回答

1

你可以得到每一个表中的公共架构与此查询:

select tablename from pg_tables where schemaname='public'; 

pg_tables doc

,让每所有序列你可以这样做的公共架构:

select cs.relname, nc.nspname 
from pg_class cs 
join pg_namespace nc on cs.relnamespace = nc.oid 
where cs.relkind='S' and nc.nspname='public'; 

pg_class doc

你不应该需要一个序列,以改变序列链接到一个表。还要考虑序列是他们自己的对象,并且不属于postgres中的表格。序列必须是符合模式的唯一的名称,所以只要你改变你每次正确的模式本应该做的伎俩想要的序列。

改变一个序列语法:

ALTER SEQUENCE serial RESTART WITH 105;

alter sequence doc

一种快速的方法来做到这些更新将是动态生成的ALTER语句。然而,这需要你改变maxvalue为在所有序列中相同的值。

select 'alter sequence ' || nc.nspname || '.' || cs.relname || ' maxvalue value_to_be_set;' 
    from pg_class cs 
    join pg_namespace nc on cs.relnamespace = nc.oid 
    where cs.relkind='S' and nc.nspname='public'; 

会输出是这样的:

alter sequence public.sequence_1 maxvalue 5; 
alter sequence public.sequence_2 maxvalue 5; 
alter sequence public.sequence_3 maxvalue 5; 
+0

感谢您的回复,你可以告诉我,我如何获得表名与过相同的查询。因此,通过执行一个查询我可以更新所有序列 –

+0

@vaibhavjain更新的答案,以帮助你的问题在您的评论 – jkdba

+0

'id'是最大值,我需要更新。我在ORM上工作,我对原始SQL不太熟悉。所以我需要使用'id'而不是'value_to_be_set',这个命令会更新所有的序列? –

1

我建议你遍历序列:

SELECT * FROM pg_class WHERE relkind='S'