1. ホーム
  2. sql

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

2023-02-12 08:59:35

質問

パーティションで作業しているとき、一度にすべてのパーティションを削除する必要があることがよくあります。

しかし

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) || ' CASCADE ';
        RAISE INFO 'Dropped table: %', quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
    END LOOP;
END;
$$;

SELECT footgun('public', 'tablename');