2014-03-18 6 views
2

많은 테이블이있는 데이터베이스가 있습니다. 이 테이블 중 12 같은 접두어로 시작합니다하나의 테이블에 모든 테이블을 드롭하는 방법이 많았습니까?

mystuff_table_1 
mystuff_table_2 
mystuff_table_3 
mystuff_table_4 
etc... 

나는 반복적으로 테이블을 드롭해야 특히 이후, 또 다시 DROP TABLE mystuff_table_n CASCADE;를 입력하지 않습니다. 내 인생을 어떻게 더 쉽게 만들 수 있습니까?

+2

데이터 모델이 매우 이상하게 보입니다. "번호가 매겨진"테이블이있을 때마다 모델이 정규화되지 않았 음을 나타내는 강한 표시입니다. –

+0

이것은 실제로 내 테이블의 이름이 아니라 내 테이블에 번호가 매겨지지 않은 것입니다. 그 질문은 정규화와 관련이 없다. 가까이에있는 주제에 집중하십시오. – jononomo

+0

테이블에 번호가 매겨지지 않은 경우 왜 그런 사례를 보여 줍니까? 번호가 매겨진 테이블 (또는 그것들의 예)은 항상 모델에 관한 어떤 것이 틀렸고 단일 테이블만으로 충분할 것이라는 의심을 제기하여 전체 질문을 무효로 만듭니다. "난독 화"예제를 사용할 때 사람들이 다른 것을 위해 당신의 모범을 보게되면 놀라지 않을 것입니다. 당신이 간단하게 "나는 많은 관련없는 테이블을 떨어 뜨려야하고 나는 매번 모든 이름을 쓰고 싶지 않다"라고 쓰고 있다면 - 나는 당신의 모델에 의문을 제기하지 않을 것이다. –

답변

1

자동으로이 작업을 수행하는 프로 시저를 만들 수 있습니다

시도 :

CREATE OR REPLACE FUNCTION public.p_drop_tables (
    p_start integer, 
    p_end integer, 
    p_table varchar 
) 
RETURNS void AS 
$body$ 
DECLARE SQL VARCHAR := ''; 
BEGIN 

FOR i IN p_start..p_end LOOP 

SQL := 'DROP TABLE public.' || p_table || i || ';'; 

--RAISE NOTICE '%',SQL; 

EXECUTE (SQL); 

END LOOP; 

END; 
$body$ 
LANGUAGE 'plpgsql' 
VOLATILE 
CALLED ON NULL INPUT 
SECURITY INVOKER 
COST 100; 

AT & T는 모든

3

먼저, 당신이 할 수있는 delete many tables in a single statement :

DROP TABLE mystuff_table_1, mystuff_table_2, mystuff_table_3 CASCADE; 

다음으로, 테이블을 모두 개로 나눌 수 있습니다. 스키마. 이 스키마를 사용자의 기본 search_path에 추가하면 모두 투명합니다.

그런 다음 당신이 필요하다 : 그 정도로 짧은 아니라면

DROP SCHEMA foo CASCADE; 

이 명령을 실행하는 기능을 만들 수 있습니다.
정적 SQL 기능 :

CREATE OR REPLACE FUNCTION f_delete12() RETURNS void AS 
$func$ 
DROP TABLE mystuff_table_1, mystuff_table_2, mystuff_table_3, ... CASCADE; 
$func$ LANGUAGE sql VOLATILE; 

아니면 동적 PL/pgSQL의 기능 :

CREATE OR REPLACE FUNCTION f_delete12() 
    RETURNS void AS 
$func$ 
BEGIN 
EXECUTE (
    SELECT 'DROP TABLE ' || string_agg('mystuff_table_' || g, ', ') 
      || ' CASCADE' 
    FROM generate_series(1,12) g -- numbers 1 to 12 
    ); 
END 
$func$ LANGUAGE plpgsql VOLATILE; 

전화 : 훨씬 더 동적 명령문에 대한

SELECT f_delete12(); 

:
How do I drop all tables in psql (PostgreSQL interactive terminal) that starts with a common word?