如何从命令行删除PostgreSQL中的所有表?
我不想删除数据库本身,只想删除其中的所有表和所有数据。
如何从命令行删除PostgreSQL中的所有表?
我不想删除数据库本身,只想删除其中的所有表和所有数据。
当前回答
在Windows批处理文件中:
@echo off
FOR /f "tokens=2 delims=|" %%G IN ('psql --host localhost --username postgres --command="\dt" YOUR_TABLE_NAME') DO (
psql --host localhost --username postgres --command="DROP table if exists %%G cascade" sfkb
echo table %%G dropped
)
其他回答
将PSQL与\gexec一起使用
这是一个比迄今为止更全面的查询,因为它将处理特殊的表名。
SELECT FORMAT('DROP TABLE %I.%I.%I CASCADE;', table_catalog, table_schema, table_name)
FROM information_schema.tables
WHERE table_type = 'BASE TABLE'
AND table_schema <> 'information_schema'
AND table_schema NOT LIKE 'pg_%';
您可以预览要运行的命令,并且可以在psql中运行该查询后键入\gexec来执行该查询的输出。
注意:使用CASCADE将删除依赖于表的所有内容(如VIEW)
如果您的所有表都在一个模式中,那么这种方法可以工作(下面的代码假设您的模式的名称是公共的)
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
如果您使用PostgreSQL 9.3或更高版本,您可能还需要恢复默认授权。
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
最简单的方法是删除公共模式,正如其他人在前面的答案中所建议的那样。然而,这不是一个好方法。你永远不知道对公共模式做了什么,因为它已经被遗忘,也没有被记录。你也不知道这是否会在未来发挥同样的作用。在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语句。
继Pablo和LenW之后,这里有一个单行程序,它既准备又执行:
psql-U$PGUSER$PGDB-t-c“从pg_tables中选择'drop table\”'||tablename||'\“cascade;',其中schemaname='public'”|psql-U$PGUSER$PGDB
注意:设置$PGUSER和$PGDB或将其替换为所需的值
只需执行以下查询:
DO $$ DECLARE
r RECORD;
BEGIN
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 $$;