2016-02-27 83 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'