如何删除psql(PostgreSQL交互式终端)中以一个公共单词开头的所有表



如何删除名称以doors_开头的所有表?我可以使用drop table命令执行某种正则表达式吗?

我不喜欢编写自定义脚本,但欢迎所有解决方案。谢谢

此脚本将生成DDL命令以将它们全部删除:

SELECT 'DROP TABLE ' || t.oid::regclass || ';'
FROM   pg_class t
-- JOIN   pg_namespace n ON n.oid = t.relnamespace -- to select by schema
WHERE  t.relkind = 'r'
AND    t.relname ~~ E'doors_%' -- enter search term for table here
-- AND n.nspname ~~ '%myschema%' -- optionally select by schema(s), too
ORDER  BY 1;

强制转换t.oid::regclass使语法也适用于表名中的大小写混合标识符、保留字或特殊字符。它还可以防止SQL注入,并在必要时预写模式名称。手册中有关对象标识符类型的详细信息。

关于架构搜索路径。

您也可以自动删除,但在删除之前不检查实际删除的内容是不明智的。

您可以将CASCADE附加到DROP依赖对象(视图和引用外键)的每个语句中。但是,这也是不明智的,除非你非常清楚自己在做什么。外国关键因素的限制并不是什么大损失,但这也将完全放弃所有依赖的观点。如果没有CASCADE,则会收到错误消息,通知您哪些对象阻止您删除表。然后你就可以处理它了。

我通常使用一个查询根据一些元数据表为我生成DDL命令,然后手动运行这些命令。例如:

SELECT 'DROP TABLE ' || tablename || ';' FROM pg_tables
WHERE tablename LIKE 'prefix%' AND schemaname = 'public';

这将返回一堆DROP TABLE xxx;查询,我只是简单地将其复制&粘贴到控制台。虽然您可以添加一些代码来自动执行它们,但我更喜欢自己运行它们。

最新更新