[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에서도 작동합니다 . \dt
postgres 명령 프롬프트에서 수행하십시오 ( 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와 클릭 후 삭제가 잘 작동합니다.