使用分区时,通常需要一次删除所有分区。如何使用通配符删除PostgreSQL中的多个表格
然而
DROP TABLE tablename*
不工作。 (通配符不受尊重)。
是否有一个优雅(阅读:容易记住)的方式来删除多个表中的一个命令与通配符?
使用分区时,通常需要一次删除所有分区。如何使用通配符删除PostgreSQL中的多个表格
然而
DROP TABLE tablename*
不工作。 (通配符不受尊重)。
是否有一个优雅(阅读:容易记住)的方式来删除多个表中的一个命令与通配符?
使用逗号分隔的列表:
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');
我一直觉得这样更舒服创建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
作为一个后续,如果你把所有需要删除的表放到同一个模式中,你可以将它放在级联中: drop schema abc cascade; – 2010-11-17 18:54:48
请注意,此查询还会为找到的任何序列('relkind ='S'')生成一个“drop table”命令。序列上的“drop table”将失败。相反,从'relkind IN'子句中删除''S''。如果你需要删除序列,用常量数据'select'drop sequence''构造一个类似的查询,这次使用'c.relkind ='S'' – mrjmh 2014-05-21 19:25:54
运行这是对这个问题的另一个骇人听闻的答案。它可以在ubuntu
以及其他一些操作系统上运行。在postgres命令提示符下执行\dt
(在我的情况下,命令提示符在genome-terminal
内运行)。然后你会在终端看到很多表格。现在使用genome-terminal
的ctrl+click-drag
功能复制所有表的名称。 打开python,做一些字符串处理(用''替换'',然后用','替换'\ n'),并且你得到所有表的逗号分隔列表。现在在psql shell中做一个drop table CTRL+SHIFT+V
,你就完成了。我知道这是太具体,我只是想分享。 :)
这很好用,它可以让你很容易地明确你想要什么去做。 – 2013-05-20 15:30:11
我所做的是类似的,我写道:'DROP TABLE whatever_',然后按Tab键,将所有表格复制到剪贴板,打开sublime,查找/替换,并使用正则表达式替换''s +'' ,'贴上终端。 – 2014-12-05 12:45:07
泄露:此答案是为Linux用户。
我想补充一些更具体的说明什么@prongs说:
\dt
可以支持通配符:这样你就可以例如运行\dt myPrefix*
,只选择要删除的表;CTRL-SHIFT-DRAG
后选择CTRL-SHIFT-C
复制文字;vim
,转到INSERT MODE
并粘贴表格CTRL-SHIFT-V
;ESC
,然后运行:%s/[ ]*\n/, /g
将其转换为以逗号分隔的列表,然后您可以在DROP TABLE % CASCADE
中粘贴它(不包括最后一个逗号)。使用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加载了我的服务器数据库,并做到了这一点。表格按字母顺序排序,所以移位和点击后按删除效果很好。
你可以做到这一点,但你必须使用'属性'窗口 – Matt 2017-12-07 11:37:30
我用过这个。
echo "select 'drop table '||tablename||';' from pg_tables where tablename like 'name%'" | \
psql -U postgres -d dbname -t | \
psql -U postgres -d dbname
感谢您的回答!逗号分隔列表非常适合放置一小列表。但是,一次下降20个表格(或更多)是不实际的。我会重新调整问题的清晰度。 – 2010-11-17 07:23:41
对不起,这是您唯一的选择。你可以为此构建一个存储函数,但是你很有可能会在脚中自拍:掉落太多的表... – 2010-11-17 07:26:57
函数添加,玩得开心!要小心,这可能会破坏你的整个数据库。 – 2010-11-17 07:58:06