使用分区时,通常需要一次删除所有分区.
然而
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)
pro*_*ngs 27
这是对这个问题的另一个hackish答案.它也适用于ubuntu
其他操作系统.做一个\dt
在Postgres的命令提示符(命令提示符是内部运行genome-terminal
在我的情况).然后你会在终端看到很多桌子.现在使用ctrl+click-drag
的功能genome-terminal
复制所有表的名字.打开python,进行一些字符串处理(将''by''替换为'\n'再用','),然后得到所有表的逗号分隔列表.现在在psql shell中做一个
drop table CTRL+SHIFT+V
,你就完成了.我知道这太具体我只是想分享.:)
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)
我总是觉得创建一个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运行它
披露:这个答案适用于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 {};"
Run Code Online (Sandbox Code Playgroud)
注意:最后一个回显是因为我找不到在 drop 命令周围添加引号的方法,因此您需要复制并粘贴输出并自己添加引号。
如果有人能解决这个小问题,那就太棒了。
归档时间: |
|
查看次数: |
62977 次 |
最近记录: |