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

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

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

1113364 次浏览

您可以编写一个查询来生成一个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_tableswhere schemaname = 'public'; -- or any other schema

然后运行它。

光荣的复制+粘贴也将工作。

根据上面的Pablo,从特定的模式中删除,对于case:

select 'drop table "' || tablename || '" cascade;'from pg_tables where schemaname = 'public';

如果您有PL/PGSQL过程语言安装,您可以使用以下内容在没有shell/Perl外部脚本的情况下删除所有内容。

DROP FUNCTION IF EXISTS remove_all();
CREATE FUNCTION remove_all() RETURNS void AS $$DECLARErec RECORD;cmd text;BEGINcmd := '';
FOR rec IN SELECT'DROP SEQUENCE ' || quote_ident(n.nspname) || '.'|| quote_ident(c.relname) || ' CASCADE;' AS nameFROMpg_catalog.pg_class AS cLEFT JOINpg_catalog.pg_namespace AS nONn.oid = c.relnamespaceWHERErelkind = 'S' ANDn.nspname NOT IN ('pg_catalog', 'pg_toast') ANDpg_catalog.pg_table_is_visible(c.oid)LOOPcmd := cmd || rec.name;END LOOP;
FOR rec IN SELECT'DROP TABLE ' || quote_ident(n.nspname) || '.'|| quote_ident(c.relname) || ' CASCADE;' AS nameFROMpg_catalog.pg_class AS cLEFT JOINpg_catalog.pg_namespace AS nONn.oid = c.relnamespace WHERE relkind = 'r' ANDn.nspname NOT IN ('pg_catalog', 'pg_toast') ANDpg_catalog.pg_table_is_visible(c.oid)LOOPcmd := cmd || rec.name;END LOOP;
FOR rec IN SELECT'DROP FUNCTION ' || quote_ident(ns.nspname) || '.'|| quote_ident(proname) || '(' || oidvectortypes(proargtypes)|| ');' AS nameFROMpg_procINNER JOINpg_namespace nsON(pg_proc.pronamespace = ns.oid)WHEREns.nspname ='public'ORDER BYpronameLOOPcmd := cmd || rec.name;END LOOP;
EXECUTE cmd;RETURN;END;$$ LANGUAGE plpgsql;
SELECT remove_all();

与其在“psql”提示符下输入此内容,我建议您将其复制到文件中,然后使用“--file”或“-f”选项将文件作为输入传递给psql:

psql -f clean_all_pg.sql

功劳归我:我写了这个函数,但我认为查询(或者至少第一个)来自几年前的某个pgsql邮件列表上的人。不记得确切的时间或哪一个。

在Pablo和LenW之后,这里有一个单行代码,它既可以准备又可以执行:

psql -U $PGUSER $PGDB -t -c "select 'drop table \"' || tablename || '\" cascade;' from pg_tables where schemaname = 'public'" | psql -U $PGUSER $PGDB

注意:用您想要的值设置或替换#0和#1

以防万一…清理Postgresql数据库的简单Python脚本

import psycopg2import 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依赖它。

drop schema public cascade;

应该做的把戏。

如果您的所有表都在一个架构中,这种方法可以工作(下面的代码假设您的架构的名称为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;

您可以使用string_agg函数创建一个逗号分隔的列表,非常适合DROP TABLE。从bash脚本:

#!/bin/bashTABLES=`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"

在Windows批处理文件中:

@echo offFOR /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" sfkbecho table %%G dropped)

在撰写本文时(2014年1月)最被接受的答案是:

drop schema public cascade;create schema public;

但是,如果您的意图是将公共模式恢复到其原始状态,这确实有效,这并不能完全完成任务。在PostgreSQL 9.3.1的pgAdmin III下,如果您单击以这种方式创建的“公共”模式并在“SQL窗格”中查看,您将看到以下内容:

-- Schema: public
-- DROP SCHEMA public;
CREATE SCHEMA publicAUTHORIZATION postgres;

但是,相比之下,一个全新的数据库将具有以下内容:

-- Schema: public
-- DROP SCHEMA public;
CREATE SCHEMA publicAUTHORIZATION postgres;
GRANT ALL ON SCHEMA public TO postgres;GRANT ALL ON SCHEMA public TO public;COMMENT ON SCHEMA publicIS '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中发出这些命令,我使用查询工具(放大镜图标“执行异常SQL查询”)或者您可以使用插件->PSQL控制台

说明

如果您安装了任何扩展,它们将在删除模式时被删除,因此您应该记下您需要安装的内容,然后根据需要执行语句。例如。

CREATE EXTENSION postgis;

Rails的Rake任务用于销毁当前数据库中的所有表

namespace :db do# rake db:drop_all_tablestask drop_all_tables: :environment doquery = <<-QUERYSELECTtable_nameFROMinformation_schema.tablesWHEREtable_type = 'BASE TABLE'ANDtable_schema NOT IN ('pg_catalog', 'information_schema');QUERY
connection = ActiveRecord::Base.connectionresults    = connection.execute query
tables = results.map do |line|table_name = line['table_name']end.join ", "
connection.execute "DROP TABLE IF EXISTS #{ tables } CASCADE;"endend

我通过照顾视图增强了Jamie的bash方法,因为他只尊重默认的表类型“base table”。

下面的bash代码首先删除视图,然后删除其余的

#!/usr/bin/env bash
PGDB="yourDB"# By exporting user & pass your dont need to interactively type them on executionexport 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 -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 -qAtXpsql -qAtX -c "select 'DROP SEQUENCE IF EXISTS ' || quote_ident(relname) || ' CASCADE;' from pg_statio_user_sequences;" | psql -qAtX

在运行命令之前,您可能需要sudo/su到postgres用户或(导出连接详细信息PGHOSTPGPORTPGUSERPGPASSWORD),然后export PGDATABASE=yourdatabase

如果您想要删除的所有内容都是同一个用户的拥有,那么您可以使用:

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

您可以删除所有表

DO $$ DECLAREr 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()) LOOPEXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';END LOOP;END $$;

在我看来,这比drop schema public要好,因为你不需要重新创建schema并恢复所有的授权。

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

我稍微修改了Pablo的回答,以便将生成的SQL命令作为一个字符串返回:

select string_agg('drop table "' || tablename || '" cascade', '; ')from pg_tables where schemaname = 'public'

如果要删除数据(不是删除表):

-- Truncate tables and restart sequncesSELECT 'TRUNCATE TABLE "' || table_schema || '"."' || table_name || '" RESTART IDENTITY CASCADE;'FROM information_schema.tablesWHERE table_catalog = '<database>' AND table_schema = '<schema>';

或者如果你想要删除表,你可以使用这个sql:

-- For tablesSELECT 'DROP TABLE "' || table_schema || '"."' || table_name || '" CASCADE;'FROM information_schema.tablesWHERE table_catalog = '<database>' AND table_schema = '<schema>';
-- For sequencesSELECT 'DROP SEQUENCE d_a_seq "' || sequence_schema || '"."' || sequence_name || '";'FROM information_schema.sequencesWHERE sequence_catalog = '<database>' AND sequence_schema = '<schema>';

在pgAdmin中使用此脚本:

DO $$DECLAREbrow record;BEGINFOR brow IN (select 'drop table "' || tablename || '" cascade;' as table_name from pg_tables where schemaname = 'public') LOOPEXECUTE brow.table_name;END LOOP;END; $$

好吧,因为我喜欢从命令行工作…

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 relationsSchema |       Name        | Type  |  Owner--------+-------------------+-------+----------public | _d_psidxddlparm   | table | djuserpublic | _d_psindexdefn    | table | djuser

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

然后使用seddrop table加上前缀,并为;命令分隔符加上后缀。

| egrep '_d_'-更多地将其导入grep,您可以更有选择性地删除哪些表。

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

注意:如前所述,这将为列标题的\dt命令输出和末尾的总行生成虚假行。我通过greping避免了这一点,但您可以使用headtail

最简单的方法是删除公共模式,就像其他人在之前的答案中建议的那样。然而,这不是一个好方法。你永远不知道已经对公共模式做了什么,这些公共模式已经被遗忘并且没有记录在案。你也不知道这是否会在未来起作用。在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语句。

注意:我的回答是关于真正删除表和其他数据库对象;对于删除表中的所有数据,即截断所有表,Endre两者在一个月后提供了类似的良好执行(直接执行)语句。

对于你不能只是DROP SCHEMA public CASCADE;DROP OWNED BY current_user;或其他东西的情况,这是我写的一个独立的SQL脚本,它是事务安全的(即,你可以把它放在BEGIN;ROLLBACK;之间,只是测试它,或者COMMIT;实际执行行为),并清理“所有”数据库对象……好吧,我们应用程序使用的数据库中使用的所有对象,或者我可以明智地添加,这是:

  • 表的触发器
  • 表的约束(FK、PK、CHECKUNIQUE
  • 莱迪什
  • VIEW(正常或物化)
  • 序列
  • 例程(聚合函数、函数、过程)
  • 所有nön-default(即不是public或DB-内部)模式“我们”拥有:当作为“非数据库超级用户”运行时,脚本很有用;超级用户可以删除所有模式(虽然仍然显式排除了真正重要的模式)
  • 扩展(用户贡献的,但我通常故意把它们留在里面)

没有删除的是(有些是故意的;有些只是因为我在我们的数据库中没有示例):

  • public模式(例如,其中包含扩展提供的内容)
  • 排序规则和其他语言环境的东西
  • 事件触发器
  • 文本搜索的东西,…(见这里其他我可能错过的东西)
  • 角色或其他安全设置
  • 复合类型
  • 吐司桌
  • 外籍家政工人和外国表

当您要恢复的转储的数据库模式版本(例如使用Debiandbconfig-common、Flyway或Liquibase/DB-Manul)与您要将其恢复到的数据库不同时,这是真的有用的。

我也有一个版本,它删除了“除了两个表之外的所有内容以及属于它们的内容”(一个序列,手动测试,对不起,我知道,无聊),以防有人感兴趣;差异很小。如果感兴趣,请联系我或查这个仓库

SQL

-- 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 $$DECLAREq TEXT;r RECORD;BEGIN-- triggersFOR r IN (SELECT pns.nspname, pc.relname, pt.tgnameFROM pg_catalog.pg_trigger pt, pg_catalog.pg_class pc, pg_catalog.pg_namespace pnsWHERE pns.oid=pc.relnamespace AND pc.oid=pt.tgrelidAND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')AND pt.tgisinternal=false) LOOPEXECUTE format('DROP TRIGGER %I ON %I.%I;',r.tgname, r.nspname, r.relname);END LOOP;-- constraints #1: foreign keyFOR r IN (SELECT pns.nspname, pc.relname, pcon.connameFROM pg_catalog.pg_constraint pcon, pg_catalog.pg_class pc, pg_catalog.pg_namespace pnsWHERE pns.oid=pc.relnamespace AND pc.oid=pcon.conrelidAND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')AND pcon.contype='f') LOOPEXECUTE format('ALTER TABLE ONLY %I.%I DROP CONSTRAINT %I;',r.nspname, r.relname, r.conname);END LOOP;-- constraints #2: the restFOR r IN (SELECT pns.nspname, pc.relname, pcon.connameFROM pg_catalog.pg_constraint pcon, pg_catalog.pg_class pc, pg_catalog.pg_namespace pnsWHERE pns.oid=pc.relnamespace AND pc.oid=pcon.conrelidAND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')AND pcon.contype<>'f') LOOPEXECUTE format('ALTER TABLE ONLY %I.%I DROP CONSTRAINT %I;',r.nspname, r.relname, r.conname);END LOOP;-- indicēsFOR r IN (SELECT pns.nspname, pc.relnameFROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pnsWHERE pns.oid=pc.relnamespaceAND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')AND pc.relkind='i') LOOPEXECUTE format('DROP INDEX %I.%I;',r.nspname, r.relname);END LOOP;-- normal and materialised viewsFOR r IN (SELECT pns.nspname, pc.relnameFROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pnsWHERE pns.oid=pc.relnamespaceAND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')AND pc.relkind IN ('v', 'm')) LOOPEXECUTE format('DROP VIEW %I.%I;',r.nspname, r.relname);END LOOP;-- tablesFOR r IN (SELECT pns.nspname, pc.relnameFROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pnsWHERE pns.oid=pc.relnamespaceAND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')AND pc.relkind='r') LOOPEXECUTE format('DROP TABLE %I.%I;',r.nspname, r.relname);END LOOP;-- sequencesFOR r IN (SELECT pns.nspname, pc.relnameFROM pg_catalog.pg_class pc, pg_catalog.pg_namespace pnsWHERE pns.oid=pc.relnamespaceAND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')AND pc.relkind='S') LOOPEXECUTE 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.extnameFROM pg_catalog.pg_extension pe, pg_catalog.pg_namespace pnsWHERE pns.oid=pe.extnamespaceAND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')) LOOPEXECUTE 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.oidFROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pns, pg_catalog.pg_aggregate paggWHERE pns.oid=pp.pronamespaceAND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast')AND pagg.aggfnoid=pp.oid) LOOPEXECUTE 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_attributeWHERE attrelid='pg_catalog.pg_proc'::regclassAND attname='prokind' -- PostgreSQL 11+) THENq := 'CASE pp.prokindWHEN ''p'' THEN ''PROCEDURE''WHEN ''a'' THEN ''AGGREGATE''ELSE ''FUNCTION''END';ELSIF EXISTS (SELECT * FROM pg_catalog.pg_attributeWHERE attrelid='pg_catalog.pg_proc'::regclassAND attname='proisagg' -- PostgreSQL ≤10) THENq := 'CASE pp.proisaggWHEN true THEN ''AGGREGATE''ELSE ''FUNCTION''END';ELSEq := '''FUNCTION''';END IF;FOR r IN EXECUTE 'SELECT pns.nspname, pp.proname, pp.oid, ' || q || ' AS ptFROM pg_catalog.pg_proc pp, pg_catalog.pg_namespace pnsWHERE pns.oid=pp.pronamespaceAND pns.nspname NOT IN (''information_schema'', ''pg_catalog'', ''pg_toast'')' LOOPEXECUTE 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-superuserFOR r IN (SELECT pns.nspnameFROM pg_catalog.pg_namespace pns, pg_catalog.pg_roles prWHERE pr.oid=pns.nspownerAND pns.nspname NOT IN ('information_schema', 'pg_catalog', 'pg_toast', 'public')AND pr.rolname=current_user) LOOPEXECUTE format('DROP SCHEMA %I;', r.nspname);END LOOP;-- voilàRAISE NOTICE 'Database cleared!';END; $$;

在PostgreSQL 9.6(jessie-backports)上测试,除了后来的添加(extensionsClément Prévost贡献)。在9.6和12.2上测试了聚合删除,在12.2上测试了过程删除。欢迎错误修复和进一步改进!

如果您无论如何都想对所有表进行核化,您可以通过将所有表放入单个语句来省略CASCADE等细节。这也使执行速度更快。

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

直接执行:

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

如适用,将TRUNCATE替换为DROP

以下步骤可能会有所帮助(对于Linux用户):

  1. 首先通过以下命令输入postgres命令提示符:

    sudo -u postgres psql
  2. 通过此命令输入数据库(我的库名为:maoss):

    \c maoss
  3. 现在输入删除所有表的命令:

    DROP SCHEMA public CASCADE;CREATE SCHEMA public;
    GRANT ALL ON SCHEMA public TO postgres;GRANT ALL ON SCHEMA public TO public;
  4. 现在通过以下命令从psql退出:

    \q

这是一个非常有趣的问题,你可以通过多种方式完成它::

1.通过删除并重新创建当前架构

在这里,通常,默认情况下我们有一个public模式。所以,我将其用作实例。

-- Recreate the schemaDROP SCHEMA public CASCADE;CREATE SCHEMA public;
-- Restore default permissionsGRANT ALL ON SCHEMA public TO postgres;GRANT ALL ON SCHEMA public TO public;

如果您使用的是PostgreSQL 9.3或更高版本,您可能还需要恢复默认授权。

优点:

这将清理整个模式并将其重新创建为新模式。

缺点:

你也会失去其他实体,如FunctionsViewsMaterialized views等。

2.使用从pg_tables表中获取所有表名。

PostgreSQL将所有表存储在名为pg_table的记录表中。

SELECT'DROP TABLE IF EXISTS "' || tablename || '" CASCADE;'frompg_tables WHERE schemaname = 'public';

如您所见,通过使用子查询,我们可以从模式中删除整个表。

优点:

当其他数据实体很重要并且您只想从模式中删除表时,这种方法对您非常有帮助。

3.终点站

  • 在shell上使用postgres用户登录
$ sudo -u postgres psql
  • 连接您的数据库
$ \c mydatabase

粘贴这些命令:

DROP SCHEMA public CASCADE;CREATE SCHEMA public;     
GRANT ALL ON SCHEMA public TO postgres;GRANT ALL ON SCHEMA public TO public;

注意:这一堆命令与第一点相似,因此优点和缺点将保持不变。

以下是为您准备的现成查询:

SELECT

'drop table if exists "' || tablename || '" cascade;' as pg_drop

pg_tables

schemaname='your schema';

对于macOS。如果您有一个通过PostgreSQL应用程序的终端,一个简单的命令可以帮助您:

drop table "organisations" cascade;

也许最简单的方法是:

  1. Drop数据库包含以下表:

    drop database DATABASE_NAME;

  2. 重新创建该数据库:

    create database DATABASE_NAME;

使用psql的基于终端的方法最适合我。我甚至创建了一个bash函数,因为它便于开发:

psqlDropTables() {PGPASSWORD=<your password>PGTABLE=<your table name>PGUSER=<your pg user name>PGPASSWORD=$PGPASSWORD psql -ah 127.0.0.1 $PGTABLE $PGUSER -c "SELECT'DROP TABLE IF EXISTS \"' || tablename || '\" CASCADE;' frompg_tables WHERE schemaname = 'public';" | grep DROP | awk 'NR>1{print $0}' | sed "s/\"/'/g" | PGPASSWORD=$PGPASSWORD xargs -i  psql -ah 127.0.0.1 $PGTABLE $PGUSER -c {}}

它创建这种反应中所述的所有必需的删除表语句,替换“with”并在DB上运行它们。

使用\gexec的PSQL

这是一个比迄今为止更全面的查询,因为它将使用特殊的表名。

SELECT FORMAT('DROP TABLE %I.%I.%I CASCADE;', table_catalog, table_schema, table_name)FROM information_schema.tablesWHERE table_type = 'BASE TABLE'AND table_schema <> 'information_schema'AND table_schema NOT LIKE 'pg_%';

您可以预览要运行的命令,并且可以在psql中运行此查询后通过键入\gexec来执行此查询的输出。

注意:使用CASCADE将丢弃所有依赖于表的东西(如VIEW

只需执行下面的查询:

DO $$ DECLAREr RECORD;BEGINFOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = current_schema()) LOOPEXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';END LOOP;END $$;