plpgsqlで明示カーソルが必要になることはめったにありません。ループのより単純で高速な暗黙カーソルを使用します。FOR
注:テーブル名はデータベースごとに一意ではないため、確実にテーブル名をスキーマ修飾する必要があります。また、関数をデフォルトのスキーマ「public」に制限します。ニーズに合わせて調整しますが、システムスキーマpg_*
とを必ず除外してくださいinformation_schema
。
これらの機能には十分注意してください。彼らはあなたのデータベースを破壊します。子供の安全装置を追加しました。RAISE NOTICE
行にコメントし、コメントEXECUTE
を外して爆弾を準備します...
CREATE OR REPLACE FUNCTION f_truncate_tables(_username text)
RETURNS void AS
$func$
DECLARE
_tbl text;
_sch text;
BEGIN
FOR _sch, _tbl IN
SELECT schemaname, tablename
FROM pg_tables
WHERE tableowner = _username
AND
-- dangerous, test before you execute!
RAISE NOTICE '%', -- once confident, comment this line ...
-- EXECUTE -- ... and uncomment this one
format('TRUNCATE TABLE %I.%I CASCADE', _sch, _tbl);
END LOOP;
END
$func$ LANGUAGE plpgsql;
format()
Postgres9.1以降が必要です。古いバージョンでは、クエリ文字列を次のように連結します。
'TRUNCATE TABLE ' || quote_ident(_sch) || '.' || quote_ident(_tbl) || ' CASCADE';
単一コマンド、ループなし
一度に複数のテーブルを作成できるためTRUNCATE
、カーソルやループはまったく必要ありません。
すべてのテーブル名を集約し、単一のステートメントを実行します。よりシンプルで高速:
CREATE OR REPLACE FUNCTION f_truncate_tables(_username text)
RETURNS void AS
$func$
BEGIN
-- dangerous, test before you execute!
RAISE NOTICE '%', -- once confident, comment this line ...
-- EXECUTE -- ... and uncomment this one
(SELECT 'TRUNCATE TABLE '
|| string_agg(format('%I.%I', schemaname, tablename), ', ')
|| ' CASCADE'
FROM pg_tables
WHERE tableowner = _username
AND schemaname = 'public'
);
END
$func$ LANGUAGE plpgsql;
電話:
SELECT truncate_tables('postgres');
洗練されたクエリ
関数も必要ありません。DO
Postgres 9.0以降では、ステートメントで動的コマンドを実行できます。また、Postgres 9.5以降では、構文がさらに単純になる可能性があります。
DO
$func$
BEGIN
-- dangerous, test before you execute!
RAISE NOTICE '%', -- once confident, comment this line ...
-- EXECUTE -- ... and uncomment this one
(SELECT 'TRUNCATE TABLE ' || string_agg(oid::regclass::text, ', ') || ' CASCADE'
FROM pg_class
WHERE relkind = 'r' -- only tables
AND relnamespace = 'public'::regnamespace
);
END
$func$;
pg_class
、pg_tables
との違いについてinformation_schema.tables
:
regclass
引用されたテーブル名について:
繰り返し使用する場合
バニラ構造とすべての空のテーブルを使用して「テンプレート」データベース(名前を付けましょう)を作成します。my_template
次に、DROP
/CREATE DATABASE
サイクルを実行します。
DROP DATABASE mydb;
CREATE DATABASE mydb TEMPLATE my_template;
Postgresは構造全体をファイルレベルでコピーするため、これは非常に高速です。同時実行の問題やその他のオーバーヘッドによって速度が低下することはありません。
同時接続によってDBをドロップできない場合は、次のことを検討してください。