본문 바로가기

DB/PostgreSQL

[ PostgreSQL ] 여러개의 Table을 한번에 Drop 시키기

반응형

psql에서 여러 개의 테이블을 삭제하는 방법을 몇 가지 정리해줄게.


1. 개별적으로 여러 개의 테이블 삭제

가장 기본적인 방법은 DROP TABLE 문을 여러 번 실행하는 것.

DROP TABLE table1, table2, table3;
  • 쉼표(,)로 여러 개의 테이블을 한 번에 삭제할 수 있음.

2. 특정 패턴을 가진 테이블 삭제 (LIKE 사용)

특정 이름 패턴을 가진 테이블을 삭제하고 싶다면, pg_catalog.pg_tables을 이용하여 DROP TABLE을 생성하면 됨.

DO $$ 
DECLARE 
    r RECORD;
BEGIN 
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tablename LIKE 'temp_%') LOOP
        EXECUTE 'DROP TABLE IF EXISTS ' || quote_ident(r.tablename) || ' CASCADE';
    END LOOP;
END $$;
  • LIKE 'temp_%' : temp_로 시작하는 모든 테이블 삭제
  • LIKE '%_temp' : _temp로 끝나는 모든 테이블 삭제
  • CASCADE : 외래 키 제약이 있는 경우 연쇄적으로 삭제

3. 스키마 내 모든 테이블 삭제

특정 스키마 내의 모든 테이블을 삭제하고 싶다면:

DO $$ 
DECLARE 
    r RECORD;
BEGIN 
    FOR r IN (SELECT tablename FROM pg_tables WHERE schemaname = 'my_schema') LOOP
        EXECUTE 'DROP TABLE IF EXISTS my_schema.' || quote_ident(r.tablename) || ' CASCADE';
    END LOOP;
END $$;
  • 'my_schema' 부분을 원하는 스키마명으로 변경

4. 모든 테이블을 한 번에 삭제 (주의!)

만약 특정 스키마의 모든 테이블을 삭제하고 싶다면, TRUNCATE 또는 DROP SCHEMA를 활용할 수도 있음.

4.1. 특정 스키마의 모든 테이블 삭제

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

4.2. 스키마 자체를 삭제 후 다시 생성

DROP SCHEMA my_schema CASCADE;
CREATE SCHEMA my_schema;
  • 이 방법은 스키마 자체를 삭제하기 때문에 모든 테이블, 시퀀스, 뷰 등이 사라짐.
  • 이후 다시 사용할 경우 CREATE SCHEMA로 복원.

5. 모든 테이블을 TRUNCATE로 비우기

테이블을 삭제하지 않고 데이터만 비우고 싶다면:

TRUNCATE TABLE table1, table2, table3 RESTART IDENTITY CASCADE;
  • RESTART IDENTITY : SERIAL 또는 IDENTITY 컬럼의 카운터를 초기화
  • CASCADE : 외래 키를 가진 테이블도 함께 초기화

🔥 결론

방법 사용 사례
DROP TABLE table1, table2; 테이블 몇 개만 삭제
DROP TABLE IF EXISTS table1, table2 CASCADE; 존재할 수도 있는 테이블 삭제
LIKE 'temp_%' 특정 패턴의 테이블 삭제
DROP SCHEMA my_schema CASCADE; 스키마 전체 삭제
TRUNCATE TABLE table1, table2 RESTART IDENTITY; 데이터만 비우기
반응형