如何从命令行删除PostgreSQL中的所有表?
我不希望删除数据库本身,只是所有的表格,并在他们所有的数据。
public
,会丢失所有已安装的扩展。
如何从命令行删除PostgreSQL中的所有表?
我不希望删除数据库本身,只是所有的表格,并在他们所有的数据。
public
,会丢失所有已安装的扩展。
Answers:
如果您所有的表都在一个模式中,则此方法可以工作(以下代码假定您的模式名称为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;
pg_
),因为它们位于不同的架构中pg_catalog
。
GRANT ALL ON SCHEMA public TO public;
在创建之后创建一个。
GRANT ALL
创建后为什么要?
您可以编写查询以生成如下的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也将起作用。
drop schema public cascade;
,但是您几乎总是有权删除表。
截至撰写本文时(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';
对我来说,使用创建网站表(web2py)的python网络框架,使用前者会导致问题:
<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查询”),也可以使用Plugins-> PSQL Console
注意
如果安装了任何扩展,则在删除架构时会将其删除,因此应记下需要安装的内容,然后根据需要执行语句。例如
CREATE EXTENSION postgis;
drop
然后create
)用于工作在PostgreSQL上9.1。升级到9.3之后,grant
必须额外增加两个。
您可以使用
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优于drop schema public
,因为您不需要重新创建schema
和恢复所有授权。
额外的好处是,它不需要外部脚本语言,也不需要将生成的SQL复制粘贴回解释器。
drop schema
技巧,因为用户不是表的所有者,而是表的所有者。这个工作虽然有效:)
EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
: EXECUTE format('DROP TABLE IF EXISTS %I CASCADE', quote_ident(r.tablename));
如果您要删除的所有内容均由同一用户拥有,则可以使用:
drop owned by the_user;
这将降低所有用户拥有。
其中包括实例化的视图,视图,序列,触发器,模式,函数,类型,集合,运算符,域等(因此,实际上是:所有)the_user
(已创建)。
您必须替换the_user
为实际的用户名,当前无法删除“当前用户”的所有内容。即将推出的9.5版本将具有选项drop owned by current_user
。
手册中的更多详细信息:http : //www.postgresql.org/docs/current/static/sql-drop-owned.html
public
架构属于postgres
,但其他所有内容都由特定用户拥有,因此删除该用户拥有的所有内容都会清除数据库(架构除外)。
drop schema public cascade;
应该可以。
CREATE SCHEMA public;
。另请参阅stackoverflow.com/a/14286370了解更多信息
如果您已安装 PL / PGSQL程序语言,则可以使用以下命令删除所有内容,而无需使用Shell / Perl外部脚本。
DROP FUNCTION IF EXISTS remove_all();
CREATE FUNCTION remove_all() RETURNS void AS $$
DECLARE
rec RECORD;
cmd text;
BEGIN
cmd := '';
FOR rec IN SELECT
'DROP SEQUENCE ' || quote_ident(n.nspname) || '.'
|| quote_ident(c.relname) || ' CASCADE;' AS name
FROM
pg_catalog.pg_class AS c
LEFT JOIN
pg_catalog.pg_namespace AS n
ON
n.oid = c.relnamespace
WHERE
relkind = 'S' AND
n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
pg_catalog.pg_table_is_visible(c.oid)
LOOP
cmd := cmd || rec.name;
END LOOP;
FOR rec IN SELECT
'DROP TABLE ' || quote_ident(n.nspname) || '.'
|| quote_ident(c.relname) || ' CASCADE;' AS name
FROM
pg_catalog.pg_class AS c
LEFT JOIN
pg_catalog.pg_namespace AS n
ON
n.oid = c.relnamespace WHERE relkind = 'r' AND
n.nspname NOT IN ('pg_catalog', 'pg_toast') AND
pg_catalog.pg_table_is_visible(c.oid)
LOOP
cmd := cmd || rec.name;
END LOOP;
FOR rec IN SELECT
'DROP FUNCTION ' || quote_ident(ns.nspname) || '.'
|| quote_ident(proname) || '(' || oidvectortypes(proargtypes)
|| ');' AS name
FROM
pg_proc
INNER JOIN
pg_namespace ns
ON
(pg_proc.pronamespace = ns.oid)
WHERE
ns.nspname =
'public'
ORDER BY
proname
LOOP
cmd := cmd || rec.name;
END LOOP;
EXECUTE cmd;
RETURN;
END;
$$ LANGUAGE plpgsql;
SELECT remove_all();
建议您不要将其复制到文件中,而应使用“ --file”或“ -f”选项将其作为输入传递给psql:
psql -f clean_all_pg.sql
归功于应得的功劳:我编写了该函数,但认为查询(或至少第一个查询)来自多年前pgsql邮件列表之一中的某个人。不记得确切的时间或哪个。
如果您仍然想对所有表进行核对,则可以通过将所有表放入单个语句中来省去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; $$
更换TRUNCATE
与DROP
适用。
public
模式进行操作时,请不要忘记在表达式中包括模式名称:string_agg(quote_ident(schemaname) || '.' || quote_ident(tablename), ', ')
而不是仅传递表名称。
在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; $$
以防万一...清理Postgresql数据库的简单Python脚本
import psycopg2
import sys
# Drop all tables from a given database
try:
conn = psycopg2.connect("dbname='akcja_miasto' user='postgres' password='postgres'")
conn.set_isolation_level(0)
except:
print "Unable to connect to the database."
cur = conn.cursor()
try:
cur.execute("SELECT table_schema,table_name FROM information_schema.tables WHERE table_schema = 'public' ORDER BY table_schema,table_name")
rows = cur.fetchall()
for row in rows:
print "dropping table: ", row[1]
cur.execute("drop table " + row[1] + " cascade")
cur.close()
conn.close()
except:
print "Error: ", sys.exc_info()[1]
确保复制后缩进正确,因为Python依赖缩进。
您可以使用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"
如果要删除数据(而不是删除表):
-- Truncate tables and restart sequnces
SELECT 'TRUNCATE TABLE "' || table_schema || '"."' || table_name || '" RESTART IDENTITY CASCADE;'
FROM information_schema.tables
WHERE table_catalog = '<database>' AND table_schema = '<schema>';
或者,如果要删除表,则可以使用以下sql:
-- For tables
SELECT 'DROP TABLE "' || table_schema || '"."' || table_name || '" CASCADE;'
FROM information_schema.tables
WHERE table_catalog = '<database>' AND table_schema = '<schema>';
-- For sequences
SELECT 'DROP SEQUENCE d_a_seq "' || sequence_schema || '"."' || sequence_name || '";'
FROM information_schema.sequences
WHERE sequence_catalog = '<database>' AND sequence_schema = '<schema>';
注意:我的回答是关于真正删除表和其他数据库对象的;为了删除表中的所有数据(即截断所有表),Endre Both在一个月后提供了类似执行良好(直接执行)的语句。
对于那些你不能只是个案DROP SCHEMA public CASCADE;
,DROP OWNED BY current_user;
或什么的,这里有一个独立的SQL脚本我写的,这是交易安全的(即你可以把它放在之间BEGIN;
,要么ROLLBACK;
只是测试它还是COMMIT;
实际做的契税)和清理“所有”数据库对象……好吧,我们应用程序使用的数据库中使用的所有那些对象,或者我可以明智地添加,即:
CHECK
、、UNIQUE
)VIEW
s(正常或物化)public
“我们”拥有的非默认(即非内部或数据库内部)模式:当以“不是数据库超级用户”身份运行时,该脚本很有用;超级用户可以删除所有纲要(尽管仍然非常明确地排除了真正重要的纲要)不放弃是(有些是故意的;有些只是因为我在数据库中没有示例):
public
模式(例如用于扩展他们提供的东西)当您要还原的转储与要还原到的数据库具有不同的数据库模式版本(例如,使用Debian ,Flyway或Liquibase / DB-Manul)时,这非常有用dbconfig-common
。
我还有一个版本可以删除“除了两个表及其所属的所有内容”(一个序列,手动测试,对不起,我知道,很无聊),以防有人感兴趣。差异很小。请与我联系或查看此仓库。
-- Copyright © 2019, 2020
-- mirabilos <t.glaser@tarent.de>
--
-- Provided that these terms and disclaimer and all copyright notices
-- are retained or reproduced in an accompanying document, permission
-- is granted to deal in this work without restriction, including un‐
-- limited rights to use, publicly perform, distribute, sell, modify,
-- merge, give away, or sublicence.
--
-- This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
-- the utmost extent permitted by applicable law, neither express nor
-- implied; without malicious intent or gross negligence. In no event
-- may a licensor, author or contributor be held liable for indirect,
-- direct, other damage, loss, or other issues arising in any way out
-- of dealing in the work, even if advised of the possibility of such
-- damage or existence of a defect, except proven that it results out
-- of said person’s immediate fault when using the work as intended.
-- -
-- Drop everything from the PostgreSQL database.
DO $$
DECLARE
q TEXT;
r RECORD;
BEGIN
-- triggers
FOR r IN (SELECT pns.nspname, pc.relname, pt.tgname
FROM pg_catalog.pg_trigger pt, pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace AND pc.oid=pt.tgrelid
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pt.tgisinternal=false
) LOOP
EXECUTE format('DROP TRIGGER %I ON %I.%I;',
r.tgname, r.nspname, r.relname);
END LOOP;
-- constraints #1: foreign key
FOR r IN (SELECT pns.nspname, pc.relname, pcon.conname
FROM pg_catalog.pg_constraint pcon, pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace AND pc.oid=pcon.conrelid
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pcon.contype='f'
) LOOP
EXECUTE format('ALTER TABLE ONLY %I.%I DROP CONSTRAINT %I;',
r.nspname, r.relname, r.conname);
END LOOP;
-- constraints #2: the rest
FOR r IN (SELECT pns.nspname, pc.relname, pcon.conname
FROM pg_catalog.pg_constraint pcon, pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace AND pc.oid=pcon.conrelid
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pcon.contype<>'f'
) LOOP
EXECUTE format('ALTER TABLE ONLY %I.%I DROP CONSTRAINT %I;',
r.nspname, r.relname, r.conname);
END LOOP;
-- indicēs
FOR r IN (SELECT pns.nspname, pc.relname
FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pc.relkind='i'
) LOOP
EXECUTE format('DROP INDEX %I.%I;',
r.nspname, r.relname);
END LOOP;
-- normal and materialised views
FOR r IN (SELECT pns.nspname, pc.relname
FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pc.relkind IN ('v', 'm')
) LOOP
EXECUTE format('DROP VIEW %I.%I;',
r.nspname, r.relname);
END LOOP;
-- tables
FOR r IN (SELECT pns.nspname, pc.relname
FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pc.relkind='r'
) LOOP
EXECUTE format('DROP TABLE %I.%I;',
r.nspname, r.relname);
END LOOP;
-- sequences
FOR r IN (SELECT pns.nspname, pc.relname
FROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pns
WHERE pns.oid=pc.relnamespace
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pc.relkind='S'
) LOOP
EXECUTE format('DROP SEQUENCE %I.%I;',
r.nspname, r.relname);
END LOOP;
-- extensions (only if necessary; keep them normally)
FOR r IN (SELECT pns.nspname, pe.extname
FROM pg_catalog.pg_extension pe, pg_catalog.pg_namespace pns
WHERE pns.oid=pe.extnamespace
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
) LOOP
EXECUTE format('DROP EXTENSION %I;', r.extname);
END LOOP;
-- aggregate functions first (because they depend on other functions)
FOR r IN (SELECT pns.nspname, pp.proname, pp.oid
FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pns, pg_catalog.pg_aggregate pagg
WHERE pns.oid=pp.pronamespace
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')
AND pagg.aggfnoid=pp.oid
) LOOP
EXECUTE format('DROP AGGREGATE %I.%I(%s);',
r.nspname, r.proname,
pg_get_function_identity_arguments(r.oid));
END LOOP;
-- routines (functions, aggregate functions, procedures, window functions)
IF EXISTS (SELECT * FROM pg_catalog.pg_attribute
WHERE attrelid='pg_catalog.pg_proc'::regclass
AND attname='prokind' -- PostgreSQL 11+
) THEN
q := 'CASE pp.prokind
WHEN ''p'' THEN ''PROCEDURE''
WHEN ''a'' THEN ''AGGREGATE''
ELSE ''FUNCTION''
END';
ELSIF EXISTS (SELECT * FROM pg_catalog.pg_attribute
WHERE attrelid='pg_catalog.pg_proc'::regclass
AND attname='proisagg' -- PostgreSQL ≤10
) THEN
q := 'CASE pp.proisagg
WHEN true THEN ''AGGREGATE''
ELSE ''FUNCTION''
END';
ELSE
q := '''FUNCTION''';
END IF;
FOR r IN EXECUTE 'SELECT pns.nspname, pp.proname, pp.oid, ' || q || ' AS pt
FROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pns
WHERE pns.oid=pp.pronamespace
AND pns.nspname NOT IN (''information_schema'', ''pg_catalog'', ''pg_toast'')
' LOOP
EXECUTE format('DROP %s %I.%I(%s);', r.pt,
r.nspname, r.proname,
pg_get_function_identity_arguments(r.oid));
END LOOP;
-- nōn-default schemata we own; assume to be run by a not-superuser
FOR r IN (SELECT pns.nspname
FROM pg_catalog.pg_namespace pns, pg_catalog.pg_roles pr
WHERE pr.oid=pns.nspowner
AND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast', 'public')
AND pr.rolname=current_user
) LOOP
EXECUTE format('DROP SCHEMA %I;', r.nspname);
END LOOP;
-- voilà
RAISE NOTICE 'Database cleared!';
END; $$;
在PostgreSQL 9.6()上进行了测试,但后来的增加(extensions
由ClémentPrévost贡献)jessie-backports
除外。骨料去除率在9.6和12.2上测试,过程去除率也在12.2上测试。错误修正和进一步的改进,欢迎您!
DROP FUNCTION
失败,反之亦然。我将功能部分修改为:AND pp.prokind ='f' -- Function
或AND pp.prokind ='p' -- Procedure
proisagg
于≤10.x上的聚合prokind
()和≥11(动态检查)上的聚合和过程(),并测试了两个☻谢谢您的提示。
这是一个非常有趣的问题,您可以通过多种方式来完成它。希望对您有用。
- 通过删除并重新创建当前模式
在这里,一般来说,public
默认情况下我们有一个模式。因此,我将其用作实例。
DROP SCHEMA `public` CASCADE;
CREATE SCHEMA `public`;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
如果您使用的是PostgreSQL 9.3或更高版本,则可能还需要恢复默认授予。
优点:
这将清除整个模式,并将其重新创建为新模式。
缺点:
你会失去其他实体的太像Functions
,Views
,Materialized views
等等。
- 通过使用从
pg_tables
表中获取所有表名。
PostgreSQL将所有表存储在名为的记录表中pg_table
。
SELECT
'DROP TABLE IF EXISTS "' || tablename || '" CASCADE;'
from
pg_tables WHERE schemaname = 'public';
如您所见,通过使用子查询,我们可以从模式中删除整个表。
优点:
当其他数据实体为“重要”并且您只想从架构中删除表时,此方法将对您有所帮助。
您需要删除表格和序列,这对我有用
psql -qAtX -c "select 'DROP TABLE IF EXISTS ' || quote_ident(table_schema) || '.' || quote_ident(table_name) || ' CASCADE;' FROM information_schema.tables where table_type = 'BASE TABLE' and not table_schema ~ '^(information_schema|pg_.*)$'" | psql -qAtX
psql -qAtX -c "select 'DROP SEQUENCE IF EXISTS ' || quote_ident(relname) || ' CASCADE;' from pg_statio_user_sequences;" | psql -qAtX
运行该命令之前,你可能需要执行sudo / su到的postgres
用户或(出口连接的详细信息PGHOST
,PGPORT
,PGUSER
和PGPASSWORD
),然后export PGDATABASE=yourdatabase
Rails的Rake任务,用于销毁当前数据库中的所有表
namespace :db do
# rake db:drop_all_tables
task drop_all_tables: :environment do
query = <<-QUERY
SELECT
table_name
FROM
information_schema.tables
WHERE
table_type = 'BASE TABLE'
AND
table_schema NOT IN ('pg_catalog', 'information_schema');
QUERY
connection = ActiveRecord::Base.connection
results = connection.execute query
tables = results.map do |line|
table_name = line['table_name']
end.join ", "
connection.execute "DROP TABLE IF EXISTS #{ tables } CASCADE;"
end
end
rake db:create
,我运行它。你可以做的史蒂夫尖端和删除代码table_name =
,并改变", "
了","
与#{ tables }
FO#{tables}
我通过照顾视图来增强了杰米的bash方法,因为他只考虑默认的表类型“基本表”。
以下bash代码首先删除视图,然后删除所有其余视图
#!/usr/bin/env bash
PGDB="yourDB"
# By exporting user & pass your dont need to interactively type them on execution
export PGUSER="PGusername"
export PGPASSWORD="PGpassword"
VIEWS=`psql -d $PGDB -t --command "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public' AND table_type='VIEW'"`
BASETBLS=`psql -d $PGDB -t --command "SELECT string_agg(table_name, ',') FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE'"`
echo Dropping views:${VIEWS}
psql $PGDB --command "DROP VIEW IF EXISTS ${VIEWS} CASCADE"
echo Dropping tables:${BASETBLS}
psql $PGDB --command "DROP TABLE IF EXISTS ${BASETBLS} CASCADE"
psql -d $PGDB -t --command "SELECT string_agg(sequence_name, ',') FROM information_schema.sequences WHERE sequence_schema='public' AND sequence_catalog='$PGDB'"
以下步骤可能会有所帮助(对于linux用户):
首先,postgres
通过以下命令输入命令提示符:
sudo -u postgres psql
通过此命令输入数据库(我的数据库名称是:)maoss
:
\c maoss
现在输入删除所有表的命令:
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;
好吧,因为我喜欢从命令行工作...
psql -U <user> -d <mydb> -c '\dt' | cut -d ' ' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"
-c '\dt'
将调用列表表命令。
List of relations
Schema | Name | Type | Owner
--------+-------------------+-------+----------
public | _d_psidxddlparm | table | djuser
public | _d_psindexdefn | table | djuser
cut -d ' ' -f 4
现在,将其输出通过管道传递到表的第四个字段(使用空格作为分隔符时)。
sed
然后使用前缀a drop table
并在;
命令后缀后缀。
| egrep '_d_'
-将其传递给grep
更多对象,您可以对删除哪些表有更多选择。
drop table if exists _d_psidxddlparm;
drop table if exists _d_psindexdefn;
注意:按照本文所述,这将为\dt
列标题的命令输出和末尾的总行生成伪造的行。我可以通过grepping来避免这种情况,但是您可以使用head
和tail
。
最简单的方法是像其他人在以前的答案中所建议的那样删除公共架构。但是,这不是一个好方法。您永远不会知道对已被遗忘且未记录在案的公共模式做了什么。您也不知道将来是否会如此。在V9中,还可以,但是在V10中,所有用户都将失去对该架构的访问权限,并且必须再次被授予访问权限,否则您的应用程序将被破坏。我没有检查过V11,但要点是,当您从一台机器到另一台机器,从一个站点到另一个站点或从一个版本到另一个版本移动时,您永远都不知道会破坏什么。如果您是有权访问数据库但不能访问架构的用户,则也无法完成此操作。
如果您需要以编程方式进行此操作,则上面的其他答案可以解决此问题,但是上面答案中没有考虑的一件事就是让Postgres为您完成工作。如果您将pg_dump与-c选项一起使用,如下所示:
sudo su postgres -c "pg_dump -U postgres WhateverDB -c -f "/home/Anyone/DBBackupWhateverDB-ServerUnscheduled.sql""
这将使用sql语句创建一个数据库还原脚本,该脚本将删除所有表。
如果提出问题的唯一目的是在还原之前删除表,那么您的还原将为您完成工作。
但是,如果您需要其他功能,则可以简单地从sql脚本复制drop语句。