How to drop multiple tables in PostgreSQL using a wildcard

前端 未结 7 1951
闹比i
闹比i 2020-12-13 05:39

When working with partitions, there is often a need to delete all partitions at once.

However

DROP TABLE tablename*

Does not work.

7条回答
  •  失恋的感觉
    2020-12-13 05:57

    Use a comma separated list:

    DROP TABLE foo, bar, baz;
    

    If you realy need a footgun, this one will do it's job:

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

提交回复
热议问题