모든 접두사가있는 내 테이블을 삭제하는 방법은 myprefix_
무엇입니까?
참고 : phpMyAdmin에서 실행해야합니다.
모든 접두사가있는 내 테이블을 삭제하는 방법은 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_%';
[...] 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;
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를 사용하는 또 다른 솔루션 이므로
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;
준비된 진술이 저를 위해 일하기에는 약간 까다 롭지 만 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
대신에 쿼리를 ;