更新序列我需要不同的系统上更新更多然后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.*);
更新序列我需要不同的系统上更新更多然后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.*);
你可以得到每一个表中的公共架构与此查询:
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;
感谢您的回复,你可以告诉我,我如何获得表名与过相同的查询。因此,通过执行一个查询我可以更新所有序列 –
@vaibhavjain更新的答案,以帮助你的问题在您的评论 – jkdba
'id'是最大值,我需要更新。我在ORM上工作,我对原始SQL不太熟悉。所以我需要使用'id'而不是'value_to_be_set',这个命令会更新所有的序列? –
我建议你遍历序列:
SELECT * FROM pg_class WHERE relkind='S'
我们不能合并这两个查询? –