Как удалить все таблицы в базе данных PostgreSQL?

На вопрос 25 июл. 2010  ·  Просмотрен 758.3k раз  ·  Источник

AP257 picture
на' 25 июл. 2010

Как я могу удалить все таблицы в PostgreSQL, работая из командной строки?

Я не хочу отбрасывать саму базу данных, только все таблицы и все данные в них.

Ответы

Derek Slife picture
на' 11 дек. 2012
1477

Если все ваши таблицы находятся в одной схеме, этот подход может работать (приведенный ниже код предполагает, что имя вашей схемы - 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;
Pablo Santa Cruz picture
на' 25 июл. 2010
429

Вы можете написать запрос для генерации сценария 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

А затем запустите его.

Великолепная КОПИЯ + ПАСТА тоже подойдет.

User picture
на' 21 янв. 2014
308

Наиболее распространенный ответ на момент написания этой статьи (январь 2014 г.):

drop schema public cascade;
create schema public;

Это работает, однако, если вы намереваетесь восстановить общедоступную схему в исходное состояние, это не решит задачу полностью. В pgAdmin III для 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';

Для меня использование веб-фреймворка python, который создает таблицы базы данных (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;

Piotr Findeisen picture
на' 15 мар. 2016
190

Вы можете удалить все таблицы с помощью

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 $$;

ИМО, это лучше, чем drop schema public , потому что вам не нужно воссоздавать schema и восстанавливать все гранты.

Дополнительный бонус в том, что для этого не требуется внешний язык сценариев или копирование сгенерированного SQL обратно в интерпретатор.

a_horse_with_no_name picture
на' 1 дек. 2015
136

Если все, что вы хотите удалить, принадлежит одному и тому же пользователю, вы можете использовать:

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

LenW picture
на' 1 мая 2012
77

Согласно приведенному выше Пабло, просто отказаться от конкретной схемы в отношении case:

select 'drop table "' || tablename || '" cascade;' 
from pg_tables where schemaname = 'public';
Joe Van Dyk picture
на' 27 окт. 2012
50
drop schema public cascade;

должен сделать свое дело.

Tim Diggins picture
на' 23 окт. 2012
32

Вслед за Пабло и ЛенВ, вот однострочная программа, которая выполняет все операции как по подготовке, так и по выполнению:

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

NB: либо установите, либо замените $PGUSER и $PGDB желаемыми значениями.

FaridLU picture
на' 27 мар. 2020
28

Следующие шаги могут быть полезны (для пользователей 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;
    
Mayur picture
на' 15 апр. 2020
26

Это действительно интересный вопрос, и вы получите его несколькими способами:

1. Удалив и воссоздав текущую схему

Здесь, как правило, по умолчанию используется схема 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 и т. Д.

2. Используя выборку всех имен таблиц из таблицы pg_tables .

PostgreSQL хранит все таблицы в своей таблице записей с именем pg_table .

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

Как видите, с помощью подзапроса мы можем удалить все таблицы из схемы.

Плюсы:

Когда другие объекты данных важны, и вы просто хотите удалить из схемы только таблицы, этот подход будет вам действительно полезен.

3. Терминал

  • Войдите в систему, используя пользователя 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;

Примечание. Этот набор команд аналогичен первому пункту, поэтому плюсы и минусы останутся прежними.