如何使用通配符在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,所以移位和点击后按删除效果很好。