如何删除名称以doors_
开头的所有表格?我可以使用drop table
命令执行某种正则表达式吗?
我不想编写自定义脚本,但欢迎所有解决方案。谢谢!
答案 0 :(得分:6)
此脚本将生成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注入,并在必要时预先设置模式名称。有关object identifier types in the manual的更多信息。
你也可以自动删除,但是不明智不会在你做之前检查你实际删除的内容。
您可以将CASCADE
附加到DROP的每个语句,具体取决于对象(视图和引用外键)。但是,除非你非常清楚自己在做什么,否则这又是不明智的。外键约束没有大的损失,但这也将完全放弃所有依赖的视图。如果没有CASCADE
,您会收到错误消息,通知您哪些对象阻止您丢弃表。然后你可以处理它。
答案 1 :(得分:5)
我通常使用一个查询根据一些元数据表为我生成DDL命令,然后手动运行这些命令。例如:
SELECT 'DROP TABLE ' || tablename || ';' FROM pg_tables
WHERE tablename LIKE 'prefix%' AND schemaname = 'public';
这将返回一堆DROP TABLE xxx;
个查询,我只需将其复制并粘贴到控制台即可。虽然您可以添加一些代码来自动执行它们,但我更喜欢自己运行它们。