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

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

然而

DROP TABLE tablename* 

不起作用。 (通配符不被尊重)。

有一个优雅(阅读:容易记得)的方式来删除多个表中的一个命令与通配符?

使用逗号分隔的列表:

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

这是对这个问题的另一个骇客答案。 它在ubuntu ,也许还有一些其他的操作系统。 在postgres命令提示符下执行一个\dt (命令提示符在我的情况下是在genome-terminal中运行)。 那么你会在terminal看到很多表格。 现在使用ctrl+click-drag genome-terminal来复制所有的表名。 在这里输入图像说明 打开python,做一些string处理(用''replace'',然后用','replace'\ n'),并且你得到所有表的逗号分隔列表。 现在在psql shell中做一个drop table CTRL+SHIFT+V ,就完成了。 我知道这是太具体,我只是想分享。 🙂

披露:这个答案是针对Linux用户的。

我会添加一些更具体的说明,以@ rongs说:

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

我总是觉得创build一个sql脚本更方便,我可以在运行之前进行检查和testing,而不是仅仅依靠获取plpgsql,这样就不会让我的数据库被冲走。 在bash中简单的select目录中的表名,然后为我创builddrop语句。 所以对于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'bubba%')

输出如下所示:

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

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

我用这个

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

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

注:最后一个回声在那里,因为我找不到一个方法来放引号,所以你需要复制和粘贴输出,并自己添加引号。

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

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