データ移行時にデータ欠損などが発生していないか各テーブルをレコード件数を数えることがあります。その際に一括でレコード件数を確認する方法をご紹介します。
pg_tablesというシステムテーブルに格納されている、ユーザーが作成したテーブルの名称を全件取得し、取得した各テーブルのレコードをCountします。
ファンクションの作成
CREATE OR REPLACE FUNCTION pg_temp.record_count()
RETURNS TABLE(objname TEXT, recordcount NUMERIC) AS $$
DECLARE
cursor_tablename CURSOR FOR
SELECT (schemaname || '.' || tablename) AS table_name
FROM pg_tables
WHERE
schemaname !~ 'pg_*' AND
schemaname != 'information_schema'
ORDER BY table_name;
BEGIN
FOR rec_table IN cursor_tablename LOOP
EXECUTE 'SELECT COUNT(*) FROM ' || rec_table.table_name INTO recordcount;
objname := rec_table.table_name;
RETURN NEXT;
END LOOP;
RETURN;
END;
$$ LANGUAGE plpgsql;
実行クエリ
SELECT * FROM pg_temp.record_count();
実行結果
テスト環境で実行した件数は以下の通りです。
※ recordcount列が各テーブルのレコード件数です。
"objname","recordcount"
"public.customer","10000"
"public.test_table","1000"
"testuser.test_table","165480"
さいごに
このファンクションは、pg_tempスキーマに作成しているため、セッションが終了すると削除されます。
永続的に利用したい場合はpublicに作成頂く方が良いです。