如何删除以常用词开头的psql(PostgreSQL交互式终端)中的所有表?

时间:2012-03-15 07:05:46

标签: postgresql

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

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

2 个答案:

答案 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的更多信息。

About the schema search path.

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

您可以将CASCADE附加到DROP的每个语句,具体取决于对象(视图和引用外键)。但是,除非你非常清楚自己在做什么,否则这又是不明智的。外键约束没有大的损失,但这也将完全放弃所有依赖的视图。如果没有CASCADE,您会收到错误消息,通知您哪些对象阻止您丢弃表。然后你可以处理它。

答案 1 :(得分:5)

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

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

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