我需要在各种系统上更多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.*);
答案 0 :(得分:1)
您可以使用此查询获取公共模式中的每个表:
select tablename from pg_tables where schemaname='public';
要获取每个公共模式的所有序列,您可以执行以下操作:
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';
您不需要将序列链接到表以更改序列。还要考虑序列是它们自己的对象,而不是“属于”postgres中的表。序列必须是每个模式的唯一名称,因此只要您按照正确的模式更改所需的序列,就应该这样做。
更改序列语法:
ALTER SEQUENCE serial RESTART WITH 105;
执行这些更新的快速方法是动态生成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'