パーティションを操作する場合、多くの場合、すべてのパーティションを一度に削除する必要があります。
しかしながら
DROP TABLE tablename*
動作しません。(ワイルドカードは尊重されません)。
ワイルドカードを使用して1つのコマンドで複数のテーブルを削除するエレガントな(読みやすい:覚えやすい)方法はありますか?
回答:
カンマ区切りのリストを使用します。
DROP TABLE foo, bar, baz;
あなたが本当にフットガンを必要とするならば、これはそれの仕事をします:
CREATE OR REPLACE FUNCTION footgun(IN _schema TEXT, IN _parttionbase TEXT)
RETURNS void
LANGUAGE plpgsql
AS
$$
DECLARE
row record;
BEGIN
FOR row IN
SELECT
table_schema,
table_name
FROM
information_schema.tables
WHERE
table_type = 'BASE TABLE'
AND
table_schema = _schema
AND
table_name ILIKE (_parttionbase || '%')
LOOP
EXECUTE 'DROP TABLE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
RAISE INFO 'Dropped table: %', quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
END LOOP;
END;
$$;
SELECT footgun('public', 'tablename');
|| ' CASCADE ';と、それは完璧です
これは、この問題に対するもう1つのハックな答えです。それはubuntu、おそらく他のいくつかのOSでも機能します。やる\dtpostgresの中には、コマンドプロンプト(コマンドプロンプトは、内部の動作していたgenome-terminal私の場合)。次に、ターミナルにたくさんのテーブルが表示されます。次に、のctrl+click-drag機能を使用して、genome-terminalすべてのテーブルの名前をコピーします。
Pythonを開き、文字列処理を実行して( ''を ''に置き換えてから、 '\ n'を '、'に置き換えます)、すべてのテーブルのコンマ区切りリストを取得します。これでpsqlシェルでadrop table CTRL+SHIFT+Vを実行すると、完了です。共有したかったのは具体的すぎることはわかっています。:)
DROP TABLE whatever_その後、Tabキーを押して、クリップボードにすべてのテーブルをコピーし、開いた崇高、検索/置換、および、正規表現を使用して交換する\s+ため,と端末に貼り付けます。
\eし、リストにコピーしてコンマを配置します。
データベースを壊さないようにplpgsqlを適切に取得することに頼るよりも、実行する前に確認してテストできるSQLスクリプトを作成する方がずっと快適だといつも感じていました。カタログからテーブル名を選択し、dropステートメントを作成するbashの単純なもの。したがって、8.4.xの場合、次の基本的なクエリが得られます。
SELECT 'drop table '||n.nspname ||'.'|| c.relname||';' as "Name"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','v','S','')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid);
where句を追加できます。(where c.relname ilike 'bubba%')
出力は次のようになります。
Name
-----------------------
drop table public.a1;
drop table public.a2;
したがって、それを.sqlファイルに保存し、psql -ffilename.sqlを使用して実行します。
drop table、見つかったすべてのシーケンスのコマンドも生成することに注意してください(relkind = 'S')。 drop tableシーケンスで失敗します。代わりに、句'S'から削除してくださいrelkind IN。シーケンスを削除する必要がある場合は、定数データを使用して同様のクエリを作成しますselect 'drop sequence'。今回はc.relkind = 'S'
開示:この回答はLinuxユーザーを対象としています。
@prongsが言ったことにいくつかのより具体的な指示を追加します:
\dtワイルドカードをサポートできます\dt myPrefix*。たとえば、実行して、削除するテーブルのみを選択できます。CTRL-SHIFT-DRAG、その後選択するCTRL-SHIFT-Cテキストをコピーします。vim、に移動しINSERT MODEてテーブルをCTRL-SHIFT-V;で貼り付けます。ESCから実行:%s/[ ]*\n/, /gして、カンマ区切りのリストに変換します。次に、(最後のカンマを除く)をDROP TABLE % CASCADE。に貼り付けることができます。Linuxコマンドラインツールを使用すると、次のように実行できます。
psql -d mydb -P tuples_only=1 -c '\dt' | cut -d '|' -f 2 | paste -sd "," | sed 's/ //g' | xargs -I{} echo psql -d mydb -c "drop table {};"
注:dropコマンドを引用符で囲む方法が見つからなかったため、最後のエコーがあります。出力をコピーして貼り付け、引用符を自分で追加する必要があります。
誰かがそのマイナーな問題を修正できるなら、それは素晴らしいソースになるでしょう。