programing

Postgre의 모든 테이블을 삭제하려면 어떻게 해야 합니까?SQL 데이터베이스?

i4 2023. 5. 31. 15:16
반응형

Postgre의 모든 테이블을 삭제하려면 어떻게 해야 합니까?SQL 데이터베이스?

Postgre에서 모든 테이블을 삭제하려면 어떻게 해야 합니까?SQL, 명령줄에서 작업 중?

데이터베이스 자체를 삭제하고 싶지 않습니다. 모든 테이블과 그 안에 있는 모든 데이터만 삭제합니다.

모든 테이블이 단일 스키마에 있는 경우 이 접근 방식이 작동할 수 있습니다(아래 코드는 스키마의 이름이public)

DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

Postgre를 사용하는 경우SQL 9.3 이상에서는 기본 허가를 복원해야 할 수도 있습니다.

GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;

쿼리를 작성하여 다음과 같은 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

그런 다음 실행합니다.

영광스러운 복사+붙여넣기도 작동합니다.

이 문서(2014년 1월)를 기준으로 가장 많이 인정되는 답변은 다음과 같습니다.

drop schema public cascade;
create schema public;

그러나 공용 스키마를 원래 상태로 복원하려는 경우에는 이 작업이 완전히 수행되지 않습니다.Postgre에 대한 pgAdmin III 미만SQL 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';

데이터베이스 테이블(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;

다음을 사용하여 모든 테이블을 삭제할 수 있습니다.

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 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기본 스키마입니다.그래서, 저는 그것을 예로 사용하고 있습니다.

-- Recreate the schema
DROP SCHEMA public CASCADE;
CREATE SCHEMA public;

-- Restore default permissions
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO public;

Postgre를 사용하는 경우SQL 9.3 이상에서는 기본 권한 부여를 복원해야 할 수도 있습니다.

찬성:

전체 스키마를 치료하고 새 스키마로 다시 만듭니다.

단점:

당신은 다른 실체들도 잃게 될 것입니다.Functions,Views,Materialized views 타기.

테이가를사용기져에서 모든 pg_tables

은 Postgre라는 이름의 합니다.SQL은 이름이 지정된 레코드 테이블에 모든 테이블을 저장합니다.pg_table.

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

보시다시피 하위 쿼리를 사용하여 스키마에서 전체 테이블을 제거할 수 있습니다.

찬성:

다른 데이터 엔터티가 중요하고 스키마에서 테이블만 삭제하려는 경우 이 방법이 도움이 됩니다.

터미널

  • 셸에서 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;

참고: 이 명령 모음은 첫 번째 포인트와 유사하므로 장단점은 동일하게 유지됩니다.

위의 Pablo에 따르면, 사례와 관련하여 특정 스키마에서 삭제하기:

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

그 묘기를 부려야 합니다.

다음 단계가 유용할 수 있습니다(Linux 사용자의 경우).

  1. 처음에 다음을 입력합니다.postgres다음 명령을 사용하여 명령 프롬프트를 표시합니다.

    sudo -u postgres psql
    
  2. 명령으로 를 입력합니다(내은 " 다명을사여데데용하스를입이다니이력이합베름터스이베터이령음데(▁enter이:름다").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
    

Pablo와 LenW에 이어 준비와 실행을 모두 수행하는 원라이너가 있습니다.

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

NB를 합니다.$PGUSER그리고.$PGDB

PL/PGSQL 절차 언어를 설치한 경우 다음을 사용하여 셸/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 메일 목록 중 하나에 있는 누군가로부터 쿼리(또는 적어도 첫 번째 쿼리)가 왔다고 생각합니다.정확히 언제 어느 것인지 기억하지 못합니다.

어쨌든 모든 테이블에 nuclear를 적용하려는 경우 모든 테이블을 단일 문에 넣어 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해당하는 경우에는

생성된 SQL 명령을 하나의 문자열로 반환할 수 있도록 Pablo의 답변을 약간 수정했습니다.

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

혹시 모르니까요...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이 의존하므로 복사 후 들여쓰기가 올바른지 확인합니다.

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

테이블 삭제가 아닌 데이터 삭제를 원하는 경우:

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

아래 쿼리를 실행합니다.

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

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"

참고: 제 대답은 테이블과 다른 데이터베이스 개체를 정말로 삭제하는 것입니다. 테이블의 모든 데이터삭제하는 것, 즉 모든 테이블을 잘라내는 것에 대해 Endre Both는 한 달 후 유사하게 잘 실행된(직접 실행) 문을 제공했습니다.

당신이 그냥 할 수 없는 경우를 위해.DROP SCHEMA public CASCADE;,DROP OWNED BY current_user;에 안전합니다( 뭔가또즉, 작독한있데립는안다니, ).BEGIN; 어느쪽든이 중 하나.ROLLBACK; 아니면 테해나거보를트스냥그.COMMIT;실제로 수행) 및 "모든" 데이터베이스 개체를 정리합니다. 음, 애플리케이션에서 사용하거나 제가 현명하게 추가할 수 있는 데이터베이스에서 사용되는 모든 개체는 다음과 같습니다.

  • 테이블의 트리거
  • 테이블의 조건(, 테이의제조건약블f((FK, PK,CHECK,UNIQUE)
  • 인디케이터
  • VIEWs 또는 s (정상또구됨화체는)됨▁material(
  • 테이블들
  • 순서들
  • 루틴(기능, 기능, 프로시저 포함
  • 이 아닌 모든 non-default(기본값 아님)public또는 DB-internal) 스키마 "우리" 소유: 스크립트는 "데이터베이스 수퍼유저가 아님"으로 실행될 때 유용합니다. 슈퍼유저는 모든 스키마를 삭제할 수 있습니다(그러나 정말 중요한 스키마는 여전히 명시적으로 제외됨).
  • 확장(사용자가 제공하지만 일반적으로 의도적으로 사용자에게 제공함)

삭제되지 않음(일부는 고의적이며 일부는 DB에 예가 없었기 때문에):

  • 그자리의 public예되는 항목의 경우) 파일 (파일: 파일 이름: 파일 이름)
  • 데이터 수집 및 기타 로케일 정보
  • 이벤트 트리거
  • 텍스트 검색 항목, …(다른 항목은 여기를 참조하십시오.)
  • 역할 또는 기타 보안 설정
  • 복합 활자
  • 토스트 테이블
  • FDW 및 외부 테이블

복원하려는 덤프가 데이터베이스 스키마 버전이 다른 경우(예: Debian)에 매우 유용합니다.dbconfig-commonFlyway 또는 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 $$
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; $$;

추가사항을 완료(테스이트됨사제추외항가후이(▁tested제테extensionsClément Prevost에 의해 기여됨), Postgre에서.SQL 9.6(jessie-backports 및 를 거쳤으며,를 거쳤습니다. 9.6 § 122에서 골재 제거 테스트를 거쳤으며, 12.2에서도 절차 제거 테스트를 거쳤습니다.버그 수정 및 추가 개선을 환영합니다!

테이블과 시퀀스를 삭제해야 합니다. 여기 제게 효과가 있었던 것이 있습니다.

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

/su로 이동해야 할 .postgres 또는 정보 내보내기)PGHOST,PGPORT,PGUSER그리고.PGPASSWORD 나서 ) 그음다다음export PGDATABASE=yourdatabase

현재 데이터베이스의 모든 테이블을 파괴하기 위해 레일에 대한 레이크 작업

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

그의 기본 테이블 유형인 "기본 테이블"만 존중하기 때문에 보기를 관리하여 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"

윈도우즈 배치 파일:

@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
)

과 함께 사용하기\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_%';

볼 수 , 이 을 " " " " " " " " " " 이라고 할 수 .\gexec 후에한행으로 후.psql.

: 사방법의 CASCADE 것: 예든것을떨것릴입다니뜨어모예(▁all다것▁drop▁willlike▁()을 떨어뜨릴 것입니다.VIEW에 달라지는

가장 쉬운 방법은 다른 사용자가 이전 답변에서 제안한 대로 공개 스키마를 삭제하는 것입니다.하지만, 이것은 좋은 방법이 아닙니다.그 이후로 잊혀지고 문서화되지 않은 공개 스키마에 어떤 작업이 수행되었는지 알 수 없습니다.여러분은 또한 이것이 미래에도 똑같이 작동할지 모릅니다.V9에서는 괜찮았지만 V10에서는 모든 사용자가 스키마에 액세스할 수 없으므로 다시 액세스할 수 있어야 합니다. 그렇지 않으면 애플리케이션이 중단됩니다.V11은 확인하지 않았지만, 중요한 것은 당신이 기계에서 기계로, 사이트에서 사이트로, 또는 버전에서 버전으로 이동하면서 무엇이 깨질지 모른다는 것입니다.또한 데이터베이스에 대한 액세스 권한이 있지만 스키마에는 액세스할 수 없는 사용자인 경우에는 이 작업을 수행할 수 없습니다.

프로그래밍 방식으로 이 작업을 수행해야 하는 경우 위의 다른 답변에서 이 문제를 다루지만 위의 답변에서 고려하지 않는 한 가지는 Postgres가 작업을 수행하도록 하는 것입니다.아래와 같이 -c 옵션과 함께 pg_dump를 사용하는 경우:

sudo su postgres -c "pg_dump -U postgres WhateverDB -c -f "/home/Anyone/DBBackupWhateverDB-ServerUnscheduled.sql""

그러면 모든 테이블을 삭제하는 sql 문이 있는 DB 복원 스크립트가 생성됩니다.

문제를 묻는 유일한 목적이 복원하기 전에 테이블을 삭제하는 것이었다면 복원을 통해 문제를 해결할 수 있습니다.

그러나 다른 용도로 필요한 경우 sql 스크립트에서 drop 문을 복사하기만 하면 됩니다.

제가 지휘부에서 일하는 걸 좋아하기 때문에...

psql -U <user> -d <mydb> -c '\dt' | cut -d ' ' -f 4 | sed -e "s/^/drop table if exists /" | sed -e "s/$/;/"

-c '\dt'command.list tables 명령을 합니다.

               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명령을 사용하여 열 머리글과 끝에 있는 총 행을 출력합니다.그랩핑으로 피하지만, 당신은 그것을 사용할 수 있습니다.head그리고.tail.

이다을용터기접방근식반널미한음을 이용한 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;' from
pg_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 {}
}

응답에 명시된 대로 필요한 모든 드롭 테이블 문을 만들고 "를 "로 대체한 후 DB에서 실행합니다.

postgis를 사용하고 공개에서 삭제하려는 사람들:-

DO $$ DECLARE
    r RECORD;
BEGIN
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename != 'spatial_ref_sys') LOOP
        EXECUTE 'DROP TABLE IF EXISTS public.' || quote_ident(r.tablename) || ' CASCADE';
    END LOOP;
END $$;

가장 간단한 방법은 다음과 같습니다.

  1. 드롭 데이터베이스에는 다음과 같은 테이블이 포함됩니다.

    drop database DATABASE_NAME;

  2. 해당 데이터베이스 다시 만들기:

    create database DATABASE_NAME;

다음은 준비된 질문입니다.

선택한다.

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

부터

pg_tables

어디에

schemaname='your schema';

언급URL : https://stackoverflow.com/questions/3327312/how-can-i-drop-all-the-tables-in-a-postgresql-database

반응형