如何在postgreSQL中动态更新序列

时间:2016-02-27 15:20:45

标签: postgresql

我需要在各种系统上更多26 tables更新序列

现在我正在为每张桌子做SELECT setval('auth_group_id_seq', max(id)) FROM auth_group;

但是他们可以迭代\dt public.*中的每个表格,然后更新序列。

我想过做这样的事情,但却得到了错误select table_name from tables where tables IN (\dt public.*);

2 个答案:

答案 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;

答案 1 :(得分:1)

我建议你迭代序列:

SELECT * FROM pg_class WHERE relkind='S'