协慌网

登录 贡献 社区

如何删除 PostgreSQL 数据库中的所有表?

如何从命令行中删除 PostgreSQL 中的所有表?

不想删除数据库本身,只是所有的表格,并在他们所有的数据。

答案

如果所有表都在单个模式中,则此方法可以工作(下面的代码假定您的模式的名称是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)