ワイルドカードを使用してPostgreSQLで複数のテーブルを削除する方法


82

パーティションを操作する場合、多くの場合、すべてのパーティションを一度に削除する必要があります。

しかしながら

DROP TABLE tablename*

動作しません。(ワイルドカードは尊重されません)。

ワイルドカードを使用して1つのコマンドで複数のテーブルを削除するエレガントな(読みやすい:覚えやすい)方法はありますか?

回答:


115

カンマ区切りのリストを使用します。

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');

3
回答ありがとうございます!カンマ区切りのリストは、テーブルの小さなリストを削除するのに最適です。ただし、一度に20個(またはそれ以上)のテーブルを削除するのは実用的ではありません。より明確にするために、質問に再び焦点を合わせます。
トムファイナー2010年

2
申し訳ありませんが、これが唯一の選択肢です。このためのストアド関数を作成することもできますが、足を踏み入れる可能性が
高くなり

4
機能が追加されました、楽しんでください!そして注意してください、これはあなたのデータベース全体を破壊するかもしれません。
フランクハイケンス2010年

ただ欠けている|| ' CASCADE ';と、それは完璧です
MFARID

28

これは、この問題に対するもう1つのハックな答えです。それはubuntu、おそらく他のいくつかのOSでも機能します。やる\dtpostgresの中には、コマンドプロンプト(コマンドプロンプトは、内部の動作していたgenome-terminal私の場合)。次に、ターミナルにたくさんのテーブルが表示されます。次に、のctrl+click-drag機能を使用して、genome-terminalすべてのテーブルの名前をコピーします。ここに画像の説明を入力してくださいPythonを開き、文字列処理を実行して( ''を ''に置き換えてから、 '\ n'を '、'に置き換えます)、すべてのテーブルのコンマ区切りリストを取得します。これでpsqlシェルでadrop table CTRL+SHIFT+Vを実行すると、完了です。共有したかったのは具体的すぎることはわかっています。:)


これはうまく機能し、やりたいことを簡単に明示することができます。
ブラッドコッホ

5
私は何が似ている、私は書く:DROP TABLE whatever_その後、Tabキーを押して、クリップボードにすべてのテーブルをコピーし、開いた崇高、検索/置換、および、正規表現を使用して交換する\s+ため,と端末に貼り付けます。
アルフォンソペレス2014

うん、これは5から多くのテーブルの場合です。長いリストの場合は、テーブル名のクエリを実行し、を使用してpsqlからエディターにキックアウト\eし、リストにコピーしてコンマを配置します。
マーリン

また、pgadmin3でスキーマ名を選択し、[依存関係]タブに移動すると、(Shiftキーを使用して)すべてのテーブルを選択し、CTRL + Cを使用してすべてをコピーできます。次にテキストエディタを使用してDROPTABLE [名前、..]クエリ。
メイトシモビッチ

18

これを使いました。

echo "select 'drop table '||tablename||';' from pg_tables where tablename like 'name%'" | \
    psql -U postgres -d dbname -t | \
    psql -U postgres -d dbname

dbnameおよびを適切な値に置き換えますname%


12

データベースを壊さないように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を使用して実行します。


フォローアップとして、削除が必要なすべてのテーブルを同じスキーマに配置すると、カスケードを使用して削除できます。dropschema abccascade;
スコットマーロウ2010年

このクエリはdrop table、見つかったすべてのシーケンスのコマンドも生成することに注意してください(relkind = 'S')。 drop tableシーケンスで失敗します。代わりに、句'S'から削除してくださいrelkind IN。シーケンスを削除する必要がある場合は、定数データを使用して同様のクエリを作成しますselect 'drop sequence'。今回はc.relkind = 'S'
mrjmh 2014年

9

開示:この回答はLinuxユーザーを対象としています。

@prongsが言ったことにいくつかのより具体的な指示を追加します:

  • \dtワイルドカードをサポートできます\dt myPrefix*。たとえば、実行して、削除するテーブルのみを選択できます。
  • 後にCTRL-SHIFT-DRAG、その後選択するCTRL-SHIFT-Cテキストをコピーします。
  • vim、に移動しINSERT MODEてテーブルをCTRL-SHIFT-V;で貼り付けます。
  • を押してESCから実行:%s/[ ]*\n/, /gして、カンマ区切りのリストに変換します。次に、(最後のカンマを除く)をDROP TABLE % CASCADE。に貼り付けることができます。

3

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コマンドを引用符で囲む方法が見つからなかったため、最後のエコーがあります。出力をコピーして貼り付け、引用符を自分で追加する必要があります。

誰かがそのマイナーな問題を修正できるなら、それは素晴らしいソースになるでしょう。


1

それで私は今日この問題に直面しました。pgadmin3を介してサーバーデータベースをロードし、そのようにしました。テーブルはアルファベット順にソートされているため、Shiftキーを押しながらクリックしてから削除すると効果的です。


これは可能ですが、「プロパティ」ウィンドウを使用する必要があります
Matt
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.