如何删除名称以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;
查询,我只是简单地将其复制&粘贴到控制台。虽然您可以添加一些代码来自动执行它们,但我更喜欢自己运行它们。