削除できない - PostgreSQLのすべてのテーブルを削除しますか?




全テーブル 削除 (13)

PL / PGSQL手続き言語がinstalled場合は、以下を使用してシェル/ 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();

これを "psql"プロンプトで入力するのではなく、ファイルにコピーして、 " - file"または "-f"オプションを使用してpsqlへの入力としてファイルを渡すことをお勧めします:

psql -f clean_all_pg.sql

クレジットが支払われるクレジット:私は関数を書いたが、クエリ(または少なくとも最初のもの)は何年も前のpgsqlメーリングリストの誰かから来たものだと思う。 いつ、いつどちらかを正確に覚えていない。

PostgreSQLのすべてのテーブルをコマンドラインから削除するにはどうしたらいいですか?

データベース自体、すべてのテーブル、すべてのデータをドロップする必要はありません。


PabloとLenWに続いて、準備と実行の両方を行う1つのライナーがあります:

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

注意: $PGUSER$PGDBをあなたが望む値に設定するか置き換える


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

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"

この執筆時点(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 Webフレームワークを使用している私にとって:

<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からこれらのコマンドを発行することにも注意してください、私はPlugins-> PSQL Consoleに行きました)


すべてのテーブルが単一のスキーマにある場合、このアプローチが有効です(コードの下では、スキーマの名前が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;

テーブルやシーケンスを削除する必要があります

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ユーザーまたは(接続の詳細PGHOSTPGPORTPGUSER 、およびPGPASSWORDexport PGDATABASE=yourdatabase )必要があります。次に、 export PGDATABASE=yourdatabase


データを削除したい場合(テーブルを削除しない場合):

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

削除したいものがすべて同じユーザーによって所有されている場合は、次のものを使用できます。

drop owned by the_user;

これは、ユーザーが所有するすべてのものを削除します。

これには、そのthe_user所有する(作成された)マテリアライズド・ビュー、ビュー、シーケンス、トリガー、スキーマ、関数、タイプ、集計、演算子、ドメインなど(実際はすべて )がthe_userれます。

the_userを実際のユーザー名に置き換えるthe_userがあります。現在、「現在のユーザー」のすべてを削除するオプションはありません。 今後のバージョン9.5には、 drop owned by current_userオプションdrop owned by current_user

マニュアルの詳細: http://www.postgresql.org/docs/current/static/sql-drop-owned.html : http://www.postgresql.org/docs/current/static/sql-drop-owned.html


次のように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

そして、それを実行します。

Glorious COPY + PASTEも機能します。


生成されたSQLコマンドを単一の文字列として返すという便利な点についてPabloの答えを少し修正しました:

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

私はjamieから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"

drop schema public cascade;

トリックを行う必要があります。





postgresql