使用分区时,通常需要一次删除所有分区。
然而
DROP TABLE tablename*
不起作用。(不考虑通配符)。
是否有一种优雅的方法(易于记忆),可以在一个命令中使用通配符删除多个表?
Answers:
使用逗号分隔的列表:
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');
|| ' CASCADE ';
,它是完美的
这是对该问题的另一个棘手的答案。它可以工作,ubuntu
也许还有其他操作系统。做一个\dt
在Postgres的命令提示符(命令提示符是内部运行genome-terminal
在我的情况)。然后,您将在终端中看到很多表格。现在使用的ctrl+click-drag
功能genome-terminal
复制所有表的名称。打开python,进行一些字符串处理(用','替换'',然后用','替换'\ n'),您将得到所有表的逗号分隔列表。现在在psql shell中执行a即可drop table CTRL+SHIFT+V
完成。我知道我想分享的内容太具体了。:)
DROP TABLE whatever_
然后按TAB键,所有表复制到剪贴板,开放的壮美,查找/替换,并替换使用正则表达式,\s+
用于,
粘贴在终端。
\e
,将psql踢出您的编辑器,在列表中复制并放置逗号。
我一直觉得创建一个我可以在运行它之前进行审阅和测试的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子句。(where c.relname ilike 'bubba%'
)
输出看起来像这样:
Name
-----------------------
drop table public.a1;
drop table public.a2;
因此,将其保存到.sql文件并使用psql -f filename.sql运行它
drop table
针对找到的任何序列(relkind = 'S'
)生成命令。 drop table
在序列上将失败。而是'S'
从relkind IN
子句中删除。如果需要删除序列,请select 'drop sequence'
使用c.relkind = 'S'