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

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

하나

DROP TABLE tablename*

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

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



답변

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

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


답변

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


답변

나는 이것을 사용했다.

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%.


답변

나는 항상 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로 실행하십시오.


답변

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

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

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


답변

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 {};"

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

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


답변

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