Programing

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

lottogame 2020. 9. 4. 08:00
반응형

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


모든 접두사가있는 내 테이블을 삭제하는 방법은 myprefix_무엇입니까?

참고 : phpMyAdmin에서 실행해야합니다.


하나의 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_%';

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

'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 프로그래머에게 유용하기를 바랍니다.


show tables like 'prefix_%';

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

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

drop table myprefix_1, myprefix_2, myprefix_3;

@ 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에 대해 구현할 수 있습니다.


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

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;

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

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

drop table myprefix_1, myprefix_2, myprefix_3;

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

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


내가 사용한 정확한 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;

준비된 진술이 저를 위해 일하기에는 약간 까다 롭지 만 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_%';

Then carefully cut-and-paste the resulting long DROP statement.


Just another solution using GROUP_CONCAT so it will execute one drop query like
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;

참고URL : https://stackoverflow.com/questions/1589278/sql-deleting-tables-with-prefix

반응형