如何从命令行删除PostgreSQL中的所有表?
我不想删除数据库本身,只想删除其中的所有表和所有数据。
如何从命令行删除PostgreSQL中的所有表?
我不想删除数据库本身,只想删除其中的所有表和所有数据。
当前回答
下面是现成的查询:
选择
'drop table if exists "' || tablename || '" cascade;' as pg_drop
FROM
pg_tables
哪里
schemaname='your schema';
其他回答
如果要删除的所有内容都属于同一用户,则可以使用:
drop owned by the_user;
这将删除用户拥有的所有内容。
这包括用户拥有(=创建)的物化视图、视图、序列、触发器、模式、函数、类型、聚合、运算符、域等(实际上是:所有)。
您必须用实际的用户名替换_user,目前没有选项删除“当前用户”的所有内容。即将推出的9.5版本将拥有current_user拥有的选项drop。
手册中的更多详细信息:http://www.postgresql.org/docs/current/static/sql-drop-owned.html
您可以使用string_agg函数创建逗号分隔的列表,非常适合DROP TABLE。从bash脚本:
#!/bin/bash
TABLES=`psql $PGDB -t --command "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public'"`
echo Dropping tables:${TABLES}
psql $PGDB --command "DROP TABLE IF EXISTS ${TABLES} CASCADE"
您可以编写一个查询来生成SQL脚本,如下所示:
select 'drop table "' || tablename || '" cascade;' from pg_tables;
Or:
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也将发挥作用。
继Pablo和LenW之后,这里有一个单行程序,它既准备又执行:
psql-U$PGUSER$PGDB-t-c“从pg_tables中选择'drop table\”'||tablename||'\“cascade;',其中schemaname='public'”|psql-U$PGUSER$PGDB
注意:设置$PGUSER和$PGDB或将其替换为所需的值
最简单的方法是删除公共模式,正如其他人在前面的答案中所建议的那样。然而,这不是一个好方法。你永远不知道对公共模式做了什么,因为它已经被遗忘,也没有被记录。你也不知道这是否会在未来发挥同样的作用。在V9中,这是很好的,但在V10中,所有用户都将失去对模式的访问,必须再次获得访问权限,否则应用程序将崩溃。我还没有检查过V11,但问题是,当你从一台机器移动到另一台机器、从一个站点移动到另个站点或从一个版本移动到另另一个版本时,你永远不知道会发生什么。如果您是有权访问数据库但不能访问模式的用户,则也无法执行此操作。
如果您需要以编程方式完成这项工作,那么上面的其他答案也涵盖了这一点,但上面的答案没有考虑到的一点是让Postgres为您完成这项任务。如果将pg_dump与-c选项一起使用,如下所示:
sudo su postgres -c "pg_dump -U postgres WhateverDB -c -f "/home/Anyone/DBBackupWhateverDB-ServerUnscheduled.sql""
这将创建一个包含sql语句的DB还原脚本,该脚本将删除所有表。
如果问这个问题的唯一目的是在还原之前删除表,那么还原将为您完成这项工作。
但是,如果您在其他方面需要它,您可以简单地从sql脚本复制drop语句。