如何使用通配符删除PostgreSQL中的多个表

Tom*_*ner 71 sql postgresql

使用分区时,通常需要一次删除所有分区.

然而

DROP TABLE tablename*
Run Code Online (Sandbox Code Playgroud)

不行.(不遵守通配符).

是否有一种优雅(读取:易记)的方式在一个命令中使用通配符删除多个表?

Fra*_*ens 107

使用逗号分隔的列表:

DROP TABLE foo, bar, baz;
Run Code Online (Sandbox Code Playgroud)

如果你真的需要一个步枪,这个人会做它的工作:

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');
Run Code Online (Sandbox Code Playgroud)

  • 添加功能,玩得开心!请注意,这个可能会破坏整个数据库. (4认同)
  • 谢谢回答!以逗号分隔的列表非常适合删除一小组表.但是,一次(或更多)丢弃20个表是不切实际的.我会重新关注这个问题,使其更加清晰. (3认同)
  • 抱歉,这是您唯一的选择。您可以为此构造一个存储的函数,但是很有可能会使自己陷入困境:丢弃太多表... (2认同)

pro*_*ngs 27

这是对这个问题的另一个hackish答案.它也适用于ubuntu其他操作系统.做一个\dt在Postgres的命令提示符(命令提示符是内部运行genome-terminal在我的情况).然后你会在终端看到很多桌子.现在使用ctrl+click-drag的功能genome-terminal复制所有表的名字.在此输入图像描述打开python,进行一些字符串处理(将''by''替换为'\n'再用','),然后得到所有表的逗号分隔列表.现在在psql shell中做一个drop table CTRL+SHIFT+V,你就完成了.我知道这太具体我只是想分享.:)

  • 我做的是类似的,我写道:`DROP TABLE whatever_`然后按TAB,将所有表复制到剪贴板,打开sublime,查找/替换,并使用正则表达式替换,``\ s +``for``, ``并粘贴在终端上. (5认同)

isa*_*clw 14

我用过这个.

echo "select 'drop table '||tablename||';' from pg_tables where tablename like 'name%'" | \
    psql -U postgres -d dbname -t | \
    psql -U postgres -d dbname
Run Code Online (Sandbox Code Playgroud)


Sco*_*owe 9

我总是觉得创建一个sql脚本更舒服我可以在运行它之前查看和测试,而不是依赖于使plpgsql恰到好处,所以它不会吹走我的数据库.在bash中简单的选择目录中的表名,然后为我创建drop语句.所以对于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);
Run Code Online (Sandbox Code Playgroud)

您可以在其中添加where子句.(其中c.relname ilike'bubba%')

输出如下:

         Name          
-----------------------
 drop table public.a1;
 drop table public.a2;
Run Code Online (Sandbox Code Playgroud)

因此,将其保存到.sql文件并使用psql -f filename.sql运行它


Cam*_*mpa 9

披露:这个答案适用于Linux用户.

我会为@prongs所说的添加一些更具体的说明:

  • \dt可以支持通配符:所以你可以运行\dt myPrefix*,例如,只选择你想要删除的表;
  • 之后CTRL-SHIFT-DRAG选择然后CTRL-SHIFT-C复制文本;
  • in vim,转到INSERT MODE并粘贴表格CTRL-SHIFT-V;
  • ESC,然后运行:%s/[ ]*\n/, /g将其翻译为逗号分隔列表,然后您可以粘贴它(不包括最后一个逗号)DROP TABLE % CASCADE.


Jon*_*Jon 5

使用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 {};"
Run Code Online (Sandbox Code Playgroud)

注意:最后一个回显是因为我找不到在 drop 命令周围添加引号的方法,因此您需要复制并粘贴输出并自己添加引号。

如果有人能解决这个小问题,那就太棒了。