更新序列我需要不同的系統上更新更多然後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'
我們不能合併這兩個查詢? –