如果所有表都在单个模式中,则此方法可以工作(下面的代码假定您的模式的名称是public
)
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
如果您使用的是 PostgreSQL 9.3 或更高版本,则可能还需要恢复默认授权。
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
您可以编写查询来生成如下所示的 SQL 脚本:
select 'drop table "' || tablename || '" cascade;' from pg_tables;
要么:
select 'drop table if exists "' || tablename || '" cascade;' from pg_tables;
如果由于前一句中的级联选项而自动删除某些表。
此外,如注释中所述,您可能希望按模式名称筛选要删除的表:
select 'drop table if exists "' || tablename || '" cascade;'
from pg_tables
where schemaname = 'public'; -- or any other schema
然后运行它。
光荣的 COPY + PASTE 也会起作用。
截至撰写本文时(2014 年 1 月),最受欢迎的答案是:
drop schema public cascade;
create schema public;
这确实有效,但是如果您打算将公共模式恢复到其原始状态,则这不能完全完成任务。在 PostgreSQL 9.3.1 的 pgAdmin III 下,如果单击以这种方式创建的 “公共” 模式并查看 “SQL 窗格”,您将看到以下内容:
-- Schema: public
-- DROP SCHEMA public;
CREATE SCHEMA public
AUTHORIZATION postgres;
但是,相比之下,全新的数据库将具有以下特征:
-- Schema: public
-- DROP SCHEMA public;
CREATE SCHEMA public
AUTHORIZATION postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public
IS 'standard public schema';
对于我使用 python web 框架创建数据库表(web2py),使用前者导致的问题:
<class 'psycopg2.ProgrammingError'> no schema has been selected to create in
所以在我看来,完全正确的答案是:
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
COMMENT ON SCHEMA public IS 'standard public schema';
(还要注意从 pgAdmin III 发出这些命令,我去了 Plugins-> PSQL Console)