2010-11-17 73 views

回答

91

使用逗号分隔的列表:

DROP TABLE foo, bar, baz; 

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

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-11-17 07:23:41

+1

对不起,这是您唯一的选择。你可以为此构建一个存储函数,但是你很有可能会在脚中自拍:掉落太多的表... – 2010-11-17 07:26:57

+2

函数添加,玩得开心!要小心,这可能会破坏你的整个数据库。 – 2010-11-17 07:58:06

5

我一直觉得这样更舒服创建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); 

你可以添加一个where子句。 (其中c.relname ILIKE '布巴%')

输出看起来是这样的:

  Name   
----------------------- 
drop table public.a1; 
drop table public.a2; 

所以,这保存到.sql文件,并用psql -f filename.sql

+0

作为一个后续,如果你把所有需要删除的表放到同一个模式中,你可以将它放在级联中: drop schema abc cascade; – 2010-11-17 18:54:48

+0

请注意,此查询还会为找到的任何序列('relkind ='S'')生成一个“drop table”命令。序列上的“drop table”将失败。相反,从'relkind IN'子句中删除''S''。如果你需要删除序列,用常量数据'select'drop sequence''构造一个类似的查询,这次使用'c.relkind ='S'' – mrjmh 2014-05-21 19:25:54

24

运行这是对这个问题的另一个骇人听闻的答案。它可以在ubuntu以及其他一些操作系统上运行。在postgres命令提示符下执行\dt(在我的情况下,命令提示符在genome-terminal内运行)。然后你会在终端看到很多表格。现在使用genome-terminalctrl+click-drag功能复制所有表的名称。 enter image description here打开python,做一些字符串处理(用''替换'',然后用','替换'\ n'),并且你得到所有表的逗号分隔列表。现在在psql shell中做一个drop table CTRL+SHIFT+V,你就完成了。我知道这是太具体,我只是想分享。 :)

+0

这很好用,它可以让你很容易地明确你想要什么去做。 – 2013-05-20 15:30:11

+4

我所做的是类似的,我写道:'DROP TABLE whatever_',然后按Tab键,将所有表格复制到剪贴板,打开sublime,查找/替换,并使用正则表达式替换''s +'' ,'贴上终端。 – 2014-12-05 12:45:07

6

泄露:此答案是为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中粘贴它(不包括最后一个逗号)。
0

使用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 {};" 

注意:最后的回声是那里,因为我无法找到一种方法,把周围的下降命令报价,所以你需要复制和粘贴输出并自己添加引号。

如果任何人都可以解决这个小问题,那真是太棒了。

1

所以我今天面临这个问题。我通过pgadmin3加载了我的服务器数据库,并做到了这一点。表格按字母顺序排序,所以移位和点击后按删除效果很好。

+0

你可以做到这一点,但你必须使用'属性'窗口 – Matt 2017-12-07 11:37:30

5

我用过这个。

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