SQL : 접두사가있는 테이블 삭제


답변:


178

하나의 MySQL 명령만으로는 수행 할 수 없지만 MySQL을 사용하여 명령문을 구성 할 수 있습니다.

MySQL 셸 또는 PHPMyAdmin을 통해 다음 쿼리를 사용합니다.

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

이렇게하면 테이블을 삭제하기 위해 복사하고 실행할 수있는 DROP 문이 생성됩니다.

편집 : 여기에 고지 사항-위에서 생성 된 문은 해당 접두사가있는 모든 데이터베이스의 모든 테이블을 삭제합니다. 특정 데이터베이스로 제한하려면 쿼리를 다음과 같이 수정하고 database_name을 자신의 database_name으로 바꿉니다.

SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_schema = 'database_name' AND table_name LIKE 'myprefix_%';

데이터베이스가 하나뿐이므로 두 번째 데이터베이스가 필요하지 않습니다.
Deniz Zoeteman

4
@ElijahLynn 제한 소스는 아마도 GROUP_CONCAT 최대 길이 때문일 것입니다. 당신은 그것을 확대 예를 들어 볼 수 있습니다 여기에
Asaf 데이비드

7
self.Increase num of max char : SET SESSION group_concat_max_len = 999999999;
Mohammed Joraid 2015

2
유의하시기 바랍니다, 경우에 따라서는 테이블 접두어 이름에 밑줄을 탈출하는 것이 필요하다[...] LIKE 'myprefix\_%';
Magictallguy

1
이것은 수많은 중복 table_names를 반환합니다. Pankaj Khurana가 게시 한 답변은 IMHO에서 더 잘 작동합니다.
Jeremy

37

이전 답변 중 일부는 매우 좋았습니다. 나는 그들의 아이디어를 웹의 다른 답변에서 몇 가지 개념으로 모았습니다.

'temp_'로 시작하는 모든 테이블을 삭제해야했습니다. 몇 번 반복 한 후이 코드 블록을 생각해 냈습니다.

-- Set up variable to delete ALL tables starting with 'temp_'
SET GROUP_CONCAT_MAX_LEN=10000;
SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME)
               FROM information_schema.TABLES
              WHERE TABLE_SCHEMA = 'my_database'
                AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

다른 MySQL / PHP 프로그래머에게 유용하기를 바랍니다.


1
이것이 바로 정답입니다. 다른 답변은 여러 단계를 사용하거나 수동으로 수행해야합니다. 이 답변이 4 년 후 더 많은 표를 얻지 못하는 이유를 모르겠습니다!
gbe

25
show tables like 'prefix_%';

결과를 복사하여 텍스트 편집기에 붙여 넣거나 쿼리를 파일로 출력하고, 몇 가지 검색 및 바꾸기를 \n사용하여 원하지 않는 서식을 제거 하고 쉼표로 바꿉니다 .; 추가하고 테이블을 맨 앞에 추가합니다.

다음과 같은 결과를 얻을 수 있습니다.

drop table myprefix_1, myprefix_2, myprefix_3;

1
내가 사용하고있는 웹 호스트의 information_schema.tables에 액세스 할 수 없었기 때문에 이것이 갈 길이었습니다.
Florent Roques

10

@ andre-miller 솔루션은 좋지만 한 번에 모든 작업을 수행하는 데 도움이되는 더 좋고 약간 더 전문적인 솔루션이 있습니다. 여전히 둘 이상의 명령이 필요하지만이 솔루션을 사용하면 자동화 된 빌드에 SQL을 사용할 수 있습니다.

SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) 
    FROM information_schema.TABLES
    WHERE TABLE_NAME LIKE 'myprefix_%');
PREPARE stmt FROM 'DROP TABLE @tbls';
EXECUTE stmt USING @tbls;
DEALLOCATE PREPARE stmt;

참고 :이 코드는 플랫폼에 따라 다르며 MySQL 용이지만 약간의 변경으로 Postgre, Oracle 및 MS SQL에 대해 구현할 수 있습니다.


오류 1064 (42000) : SQL 구문에 오류가 있습니다. MySQL 서버 버전에 해당하는 설명서에서 '@tbls'라인 1 근처에서 사용할 올바른 구문을 확인하십시오. 오류 1243 (HY000) : EXECUTE ERROR 1243 (HY000)에 지정된 알 수없는 준비된 문 처리기 (stmt) : 알 수없는 준비된 문 처리기 (stmt) DEALLOCATE PREPARE에 제공
Roni Tovi 2014

구문 오류 : PREPARE stmt FROM 'DROP TABLE @tbls';
ledawg

5
SELECT CONCAT("DROP TABLE ", table_name, ";") 
FROM information_schema.tables
WHERE table_schema = "DATABASE_NAME" 
AND table_name LIKE "PREFIX_TABLE_NAME%";

3

이처럼 쿼리를 편집하여 테이블을 성공적으로 삭제합니다.

SET GROUP_CONCAT_MAX_LEN=10000;
SET FOREIGN_KEY_CHECKS = 0;
SET @tbls = (SELECT GROUP_CONCAT(CONCAT('`', TABLE_NAME, '`'))
           FROM information_schema.TABLES
          WHERE TABLE_SCHEMA = 'pandora'
            AND TABLE_NAME LIKE 'temp_%');
SET @delStmt = CONCAT('DROP TABLE ',  @tbls);
-- SELECT @delStmt;
PREPARE stmt FROM @delStmt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;

이것은 외래 키 제약 조건을 해결하면서 한 번에 전체 작업을 수행하는 유일한 방법이었습니다.
Evan Mattson 2015

2

MySQL을 사용하여 하나의 명령으로 수행 할 수 있습니다.

drop table myprefix_1, myprefix_2, myprefix_3;

하지만 코드에서 동적으로 테이블 목록을 작성해야 할 것입니다.

대안 은 MySQL 5 용 범용 루틴 라이브러리 를 사용하는 것 입니다.


2

내가 사용한 정확한 SQL을 게시하고 싶었습니다. 상위 3 개의 답변이 혼합 된 것입니다.

SET GROUP_CONCAT_MAX_LEN=10000;

SET @del = (
    SELECT      CONCAT('DROP TABLE ', GROUP_CONCAT(TABLE_NAME), ';')
    FROM        information_schema.TABLES

    WHERE       TABLE_SCHEMA = 'database_name'
    AND         TABLE_NAME LIKE 'prefix_%'
);

PREPARE stmt FROM @del;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

2

GROUP_CONCAT를 사용하는 또 다른 솔루션 이므로
DROP TABLE table1, table2, ..

SET @Drop_Stm = CONCAT('DROP TABLE ', (
      SELECT GROUP_CONCAT(TABLE_NAME) AS All_Tables FROM information_schema.tables 
      WHERE TABLE_NAME LIKE 'prefix_%' AND TABLE_SCHEMA = 'database_name'
)); 
PREPARE Stm FROM @Drop_Stm; 
EXECUTE Stm;
DEALLOCATE PREPARE Stm;

1

준비된 진술이 저를 위해 일하기에는 약간 까다 롭지 만 GROUP_CONCAT_MAX_LEN테이블이 많을 때는 설정 이 필수적 이라는 것을 알았습니다 . 이로 인해 mysql 명령 줄 에서 잘라 내기 및 붙여 넣기를 사용하는 간단한 3 단계 프로세스가 나에게 효과적 이었습니다.

SET GROUP_CONCAT_MAX_LEN=10000;
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' ) 
    AS statement FROM information_schema.tables 
    WHERE table_name LIKE 'myprefix_%';

그런 다음 생성 된 긴 DROP 문을 조심스럽게 잘라서 붙여 넣습니다 .


\G대신에 쿼리를 ;
끝내면
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.