2016-12-12 13 views
1

(PostgreSQL 9.4)PostgreSQLでデータベースを移行する前にすべてのシーケンスを1にリセットするには?

古いデータベースを新しいスキーマに移行する途中です。 pg_restoreを使用して開発マシンから新しいスキーマ(データなし)を取得した後、一部のシーケンスが1で始まらないことがわかりました。(開発中に複数のシーケンスを変更して、より高い値で動作させました)

私はデータベースの移行を開始する前に、バック1に(主キーではありませんいくつかは)すべてのシーケンスをリセットするのプログラム方法はありますか?

ご協力ありがとうございます。

+0

「すべてのシーケンスをプログラム的にリセットする」という意味ですか? 'ALTER SEQUENCE table_name_id_seq START WITH 1;' –

+0

@M.WiśnickiTrue ...を一度に1つずつ使用できます。しかし、私は、データベース内のすべてのシーケンスをリセットするpsqlスクリプトが必要です。これは、どのテーブルからも独立したものを含みます。 (私は約150の配列を持つ100以上のテーブルを持っています)。ありがとう。 –

答えて

2

あなたはDATA_BASE_NAME

DO $$ 
DECLARE 
i TEXT; 
BEGIN 
FOR i IN (SELECT tb.table_name FROM information_schema.tables AS tb INNER JOIN information_schema.columns AS cols ON 
     tb.table_name = cols.table_name WHERE tb.table_catalog='DATA_BASE_NAME' 
     AND tb.table_schema='public' AND cols.column_name='Id') LOOP 
     EXECUTE 'SELECT setval('||'"' || i || '_Id_seq"'||',1);'; 

    END LOOP; 
END $$; 
+0

ありがとうございます。私はちょうどinformation_schemaの使用について考えていた。 –

2

これは私のニーズ、私は公共のスキーマ内のすべてのものにシーケンスを制限したいpgAdminではSETVAL manual.のための十分なシンプルな作品:

SELECT SETVAL(c.oid, 1) 
from pg_class c JOIN pg_namespace n 
on n.oid = c.relnamespace 
where c.relkind = 'S' and n.nspname = 'public' 

私はここに来て誰にも助けとしてこれを投稿してください。

0

の列Id whithすべてのテーブルを取得し、ここで、setvalループ内で使用してseqの値を変更することができます。このSQLコードでそれを行うことができます:私は情報を読み取る

DO $$ 
DECLARE 
i TEXT; 
BEGIN 
FOR i IN (SELECT column_default FROM information_schema.columns WHERE column_default SIMILAR TO 'nextval%') 
    LOOP 
     EXECUTE 'ALTER SEQUENCE'||' ' || substring(substring(i from '''[a-z_]*')from '[a-z_]+') || ' '||' RESTART 1;';  
    END LOOP; 
END $$; 

列の私はsquenceの名前を分離する正規表現を使用します。私はクエリを作成し、各シーケンスのEXECUTEを使用した後。 このコードは、DBのすべてのシーケンス用です。

関連する問題