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

我不想删除数据库本身,只想删除其中的所有表和所有数据。


当前回答

如果您无论如何都想对所有表进行核处理,可以通过将所有表放在一个语句中来省去诸如CASCADE之类的细节。这也使执行速度更快。

SELECT 'TRUNCATE TABLE ' || string_agg('"' || tablename || '"', ', ') || ';' 
FROM pg_tables WHERE schemaname = 'public';

直接执行:

DO $$
DECLARE tablenames text;
BEGIN    
    tablenames := string_agg('"' || tablename || '"', ', ') 
        FROM pg_tables WHERE schemaname = 'public';
    EXECUTE 'TRUNCATE TABLE ' || tablenames;
END; $$

如果适用,用DROP替换TRUNCATE。

其他回答

在pgAdmin中使用此脚本:

DO $$
DECLARE 
    brow record;
BEGIN
    FOR brow IN (select 'drop table "' || tablename || '" cascade;' as table_name from pg_tables where schemaname = 'public') LOOP
        EXECUTE brow.table_name;
    END LOOP;
END; $$

您可以使用

DO $$ DECLARE
    r RECORD;
BEGIN
    -- if the schema you operate on is not "current", you will want to
    -- replace current_schema() in query with 'schematodeletetablesfrom'
    -- *and* update the generate 'DROP...' accordingly.
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOP
        EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
    END LOOP;
END $$;

IMO这比丢弃模式public要好,因为您不需要重新创建模式并恢复所有授权。

额外的好处是,这不需要外部脚本语言,也不需要将生成的SQL复制粘贴回解释器。

截至本文撰写之日(2014年1月),最被接受的答案是:

drop schema public cascade;
create schema public;

然而,如果您的意图是将公共模式恢复到其原始状态,这确实有效,但这并不能完全完成任务。在pgAdmin III for PostgreSQL 9.3.1下,如果您单击以这种方式创建的“公共”模式并在“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';

对于我来说,使用一个创建数据库表(web2py)的python web框架,使用前者会导致问题:

<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中发出这些命令,我使用了查询工具(放大镜图标“执行简单的SQL查询”),或者您可以使用插件->PSQL控制台

Note

如果您安装了任何扩展,那么当您删除架构时,这些扩展将被删除,因此您应该记下需要安装的内容,然后根据需要执行语句。例如。

创建扩展postgis;

drop schema public cascade;

应该会成功。

嗯,因为我喜欢从命令行工作。。。

psql -U <user> -d <mydb> -c '\dt' | cut -d ' ' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"

-c'\dt'将调用list tables命令。

               List of relations
 Schema |       Name        | Type  |  Owner
--------+-------------------+-------+----------
 public | _d_psidxddlparm   | table | djuser
 public | _d_psindexdefn    | table | djuser

现在剪切-d“”-f 4,通过管道将其输出抓取第4个字段(当使用空格作为分隔符时),即表。

然后,sed被用于给一个drop表加前缀,并在后面加后缀;命令分隔符。

|egrep“_d_”-再将其转换为grep,这样您就可以更有选择地删除哪些表。

drop table if exists _d_psidxddlparm;
drop table if exists _d_psindexdefn;

注意:如前所述,这将为\dt命令输出的列标题和末尾的总行生成伪行。我会用grepping来避免,但你可以用head和tail。