2016-03-01 79 views
1

我在postgresql中爲所有表都有像table_name_sq這樣的序列。例如, ;postgresql使用for循環更改所有序列

seqtest-> seqtest_sq 
seqtest2-> seqtest2_sq 

我需要更改數據庫中的所有序列。 (我不能手動爲每個表運行查詢)

我可以得到表並進行序列串

select table_name || '_sq' as sequence_name from information_schema.tables where table_catalog='test' and table_schema='public' 

我可以改變順序值指定表

select setval('seqtest_sq',(select max(id) from seqtest)+1) 

但我不能合併這些二。 我認爲應該使用for循環,但我無法做到這一點。

代碼是:

DO $$ 
DECLARE 
i RECORD; 
BEGIN 
    FOR i IN (select table_name from information_schema.tables) LOOP 
     EXECUTE 'SELECT count(*) FROM ' || i; 
    END LOOP; 
END$$; 

輸出是:

ERROR: syntax error at or near ")" 
LINE 1: SELECT count(*) FROM (seqtest) 
            ^
QUERY: SELECT count(*) FROM (seqtest) 
CONTEXT: PL/pgSQL function inline_code_block line 6 at EXECUTE 
********** Error ********** 

ERROR: syntax error at or near ")" 
SQL state: 42601 
Context: PL/pgSQL function inline_code_block line 6 at EXECUTE 

而且我打印的表名與循環,但表名都用括號。

這裏是CODE

DO $$ 
DECLARE 
i RECORD; 
BEGIN 
    FOR i IN (select table_name from information_schema.tables where table_catalog='test' and table_schema='public') LOOP 
    raise notice 'Value: %',i; 
    END LOOP; 
END$$; 

這裏是OUTPUT:

NOTICE: Value: (seqtest) 
NOTICE: Value: (seqtest2) 

我認爲這是足以讓我擺脫這個括號。

你能幫我建立一個合適的循環或找到一個簡單的方法來實現這一目標嗎?

+1

只要改變'DECLARE我RECORD'到'DECLARE我TEXT' –

+1

'i'是創紀錄的,你需要在記錄中引用該列:'i.table_name' –

+0

非常感謝您的幫助。 我修復了腳本並回答了問題。 –

回答

1

這裏是@Nick巴恩斯的幫助和@a_horse_with_no_name

解決辦法,如果有人需要的如何解決序列可以使用這個腳本的想法。

DO $$ 
DECLARE 
i TEXT; 
BEGIN 
    FOR i IN (select table_name from information_schema.tables where table_catalog='YOUR_DATABASE_NAME' and table_schema='public') LOOP 
    EXECUTE 'Select setval('''||i||'_sq'', (SELECT max(id) as a FROM ' || i ||')+1);'; 
    END LOOP; 
END$$; 
1

我有一些表沒有'id'列,有些表在camelCase中使用特殊名稱,所以需要引用它們。希望這個javuzs的解決方案升級對於某個人來說是個好消息。

DO $$ 
DECLARE 
i TEXT; 
BEGIN 
    FOR i IN (SELECT tbls.table_name FROM information_schema.tables AS tbls INNER JOIN information_schema.columns AS cols ON tbls.table_name = cols.table_name WHERE tbls.table_catalog='YOUR_DATABASE_NAME' AND tbls.table_schema='public' AND cols.column_name='id') LOOP 
     EXECUTE 'SELECT setval(''"' || i || '_id_seq"'', (SELECT MAX(id) FROM ' || quote_ident(i) || '));'; 
    END LOOP; 
END $$;