megutech

自身の備忘録として主にWEBサーバー周りの技術について投稿しています。

PostgreSQLのシーケンスがずれた!

開発中色々いじっていたらシーケンスがずれた、なんてことは数年に一度くらい経験したりしないでしょうか?
そんな時にぱっと直したいときは、以下を流し込めばOKです。

DO
$$
DECLARE
    r RECORD;
    s text := 'public';
BEGIN
    FOR r IN SELECT tablename FROM pg_tables WHERE schemaname = s
    LOOP
        BEGIN
            EXECUTE 'SELECT setval(' || quote_literal(s || '.' || r.tablename || '_id_seq') ||
            ', (SELECT COALESCE(MAX(id), 1) FROM ' || s || '.' || r.tablename || '));';
        EXCEPTION WHEN OTHERS THEN
            RAISE NOTICE 'エラーが発生したテーブル: %', r.tablename;
        END;
    END LOOP;
END;
$$;

schemaやシーケンステーブルの命名規則が異なる場合は適宜修正してください。
エラーが発生したテーブルも適宜良しなに。