와일드 카드를 사용하여 PostgreSQL에서 여러 테이블을 삭제하는 방법


83

파티션으로 작업 할 때 모든 파티션을 한 번에 삭제해야하는 경우가 종종 있습니다.

하나

DROP TABLE tablename*

작동하지 않습니다. (와일드 카드는 존중되지 않습니다).

와일드 카드를 사용하여 하나의 명령으로 여러 테이블을 삭제하는 우아한 (읽기 : 기억하기 쉬운) 방법이 있습니까?

답변:


116

쉼표로 구분 된 목록을 사용하십시오.

DROP TABLE foo, bar, baz;

정말 풋 건이 필요하다면 이건 그 일을 할 것입니다 :

CREATE OR REPLACE FUNCTION footgun(IN _schema TEXT, IN _parttionbase TEXT) 
RETURNS void 
LANGUAGE plpgsql
AS
$$
DECLARE
    row     record;
BEGIN
    FOR row IN 
        SELECT
            table_schema,
            table_name
        FROM
            information_schema.tables
        WHERE
            table_type = 'BASE TABLE'
        AND
            table_schema = _schema
        AND
            table_name ILIKE (_parttionbase || '%')
    LOOP
        EXECUTE 'DROP TABLE ' || quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
        RAISE INFO 'Dropped table: %', quote_ident(row.table_schema) || '.' || quote_ident(row.table_name);
    END LOOP;
END;
$$;

SELECT footgun('public', 'tablename');

3
대답 해줘서 고마워! 쉼표로 구분 된 목록은 작은 테이블 목록을 삭제하는 데 유용합니다. 그러나 한 번에 20 개의 테이블을 삭제하는 것은 실용적이지 않습니다. 더 명확하게 질문에 다시 집중하겠습니다.
Tom Feiner 2010

2
죄송합니다. 이것이 유일한 옵션입니다. 당신은 이것에 대한 저장 기능을 구성 할 수 있지만, 당신이 스스로 발을 쏠 좋은 기회가있다 : 너무 많은 테이블을 삭제 ...
프랭크 Heikens

4
기능 추가, 재미있게 보내세요! 그리고 조심하십시오. 이것은 전체 데이터베이스를 파괴 할 수 있습니다.
Frank Heikens 2010

단지 누락 || ' CASCADE ';과 완벽
MFARID

28

이 문제에 대한 또 다른 hackish 답변이 있습니다. 그것은 ubuntu다른 OS에서도 작동합니다 . \dtpostgres 명령 프롬프트에서 수행하십시오 ( genome-terminal내 경우 에는 명령 프롬프트가 실행 중이었습니다 ). 그러면 터미널에 많은 테이블이 표시됩니다. 이제의 ctrl+click-drag기능을 사용 genome-terminal하여 모든 테이블의 이름을 복사합니다. 여기에 이미지 설명 입력파이썬을 열고 문자열 처리 ( ''를 ''로 바꾼 다음 '\ n'를 ','로 대체)를 수행하면 모든 테이블의 쉼표로 구분 된 목록이 표시됩니다. 이제 psql 셸에서 a drop table CTRL+SHIFT+V를 수행하면 완료됩니다. 공유하고 싶었던 것이 너무 구체적이라는 것을 알고 있습니다. :)


이것은 훌륭하게 작동하며, 당신이하고 싶은 일에 대해 쉽게 명시 할 수있게합니다.
Brad Koch 2013 년

5
내가하는 일은 비슷합니다. DROP TABLE whatever_그런 다음 TAB 키를 누르고 모든 테이블을 클립 보드에 복사하고 숭고한 열기, 찾기 / 바꾸기 및 정규식을 사용하여 바꾸기, \s+for ,and paste on terminal.
Alfonso Pérez 2014

네, 5 ~ 많은 테이블 용입니다. 긴 목록의 경우 테이블 이름에 대한 쿼리를 실행하고을 사용하여 psql에서 편집기로 시작하고 \e목록에 복사 한 다음 쉼표를 입력합니다.
Merlin

또한 pgadmin3에서 스키마 이름을 선택한 다음 '종속'탭으로 이동하면 모든 테이블 (Shift 키 사용)을 선택한 다음 CTRL + C를 사용하여 모두 복사 할 수 있습니다. 그런 다음 일부 텍스트 편집기를 사용하여 DROP TABLE [ name, ..] 쿼리.
Mate Šimović

18

나는 이것을 사용했다.

echo "select 'drop table '||tablename||';' from pg_tables where tablename like 'name%'" | \
    psql -U postgres -d dbname -t | \
    psql -U postgres -d dbname

dbname및 을 적절한 값으로 대체하십시오 name%.


13

나는 항상 plpgsql을 올바르게 얻는 것에 의존하는 것보다 실행하기 전에 검토하고 테스트 할 수있는 sql 스크립트를 만드는 것이 내 데이터베이스를 날려 버리지 않도록하는 것이 더 편하다고 느꼈습니다. 카탈로그에서 테이블 이름을 선택한 다음 나를 위해 drop 문을 생성하는 bash의 간단한 것. 따라서 8.4.x의 경우 다음과 같은 기본 쿼리를 얻을 수 있습니다.

SELECT 'drop table '||n.nspname ||'.'|| c.relname||';' as "Name" 
FROM pg_catalog.pg_class c
     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('r','v','S','')
     AND n.nspname <> 'pg_catalog'
     AND n.nspname <> 'information_schema'
     AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid);

where 절을 추가 할 수 있습니다. ( where c.relname ilike 'bubba%')

출력은 다음과 같습니다.

         Name          
-----------------------
 drop table public.a1;
 drop table public.a2;

따라서 .sql 파일에 저장하고 psql -f filename.sql로 실행하십시오.


후속 조치로 삭제가 필요한 모든 테이블을 동일한 스키마에 넣으면 cascade를 사용하여 삭제할 수 있습니다. drop schema abc cascade;
Scott Marlowe

이 쿼리는 또한 drop table찾은 모든 시퀀스에 대한 명령을 생성합니다 ( relkind = 'S'). drop table시퀀스에서 실패합니다. 대신 절 'S'에서 제거하십시오 relkind IN. 시퀀스를 삭제해야하는 경우 상수 데이터로 유사한 쿼리를 생성합니다. select 'drop sequence'이번에는c.relkind = 'S'
mrjmh

9

공개 :이 답변은 Linux 사용자를위한 것입니다.

@prongs가 말한 것에 더 구체적인 지침을 추가합니다.

  • \dt와일드 카드를 지원할 수 있습니다 \dt myPrefix*. 예를 들어 삭제하려는 테이블 만 선택하기 위해 실행할 수 있습니다 .
  • CTRL-SHIFT-DRAG다음 선택 CTRL-SHIFT-C텍스트를 복사;
  • 에서 테이블로 vim이동하여 INSERT MODE붙여 넣으십시오 CTRL-SHIFT-V.
  • 을 누른 ESC다음 실행 :%s/[ ]*\n/, /g하여 쉼표로 구분 된 목록으로 번역 한 다음 마지막 쉼표를 제외하고 붙여 넣을 수 있습니다 DROP TABLE % CASCADE.

3

Linux 명령 줄 도구를 사용하면 다음과 같이 할 수 있습니다.

psql -d mydb -P tuples_only=1 -c '\dt' | cut -d '|' -f 2 | paste -sd "," | sed 's/ //g' | xargs -I{} echo psql -d mydb -c "drop table {};"

참고 : 마지막 에코는 드롭 명령 주위에 따옴표를 넣는 방법을 찾을 수 없기 때문에 출력을 복사하여 붙여넣고 따옴표를 직접 추가해야합니다.

누구나 그 사소한 문제를 해결할 수 있다면 그것은 멋진 소스가 될 것입니다.


1

그래서 오늘이 문제에 직면했습니다. pgadmin3을 통해 서버 DB를로드하고 그렇게했습니다. 표는 알파벳순으로 정렬되어 있으므로 Shift와 클릭 후 삭제가 잘 작동합니다.


이 작업을 수행 할 수 있지만 '속성'창을 사용해야합니다
Matt
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.