Existe um comando MySQL para implementar algo como “tabelas gota exceto t1, b2”?
Pergunta
Eu quero manter T1, T2 e soltar todas as outras tabelas.
Solução
Você pode usar information_schema
para encontrar nomes de tabela, e até mesmo formatar os resultados como um bando de declarações DROP
.
SELECT CONCAT('DROP TABLE ', TABLE_NAME, '; ')
FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_name NOT IN ('foo', 'bar', 'baz');
(A função DATABASE()
retorna o banco de dados atualmente use
'd.)
Usando PREPARE
e EXECUTE
, você poderia até mesmo evitar copiar e colar, e (no MySQL 5.0.13 e posterior) escrever um procedimento armazenado para fazer isso.
Outras dicas
Você pode usar o mysqldump para gerar uma lista de declarações DROP TABLE, filtrar aqueles que você não quer, então canalizá-lo de volta para o cliente mysql. Aqui está como nós construir essa up
Em primeiro lugar, aqui está uma lista de DROP TABLE tabela para o banco de dados
mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \
grep ^DROP
Agora podemos tubulação que através grep com -v para inverter a partida - queremos afirmações que não mencionam as tabelas que está retendo (outra maneira de fazer isso seria opções --ignore-Table para mysqldump)
mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \
grep ^DROP |
grep -v 'foo\|bar'
Finalmente, uma vez que você está confiante, você pode canalizar que volta para mysql
mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \
grep ^DROP | \
grep -v 'foo\|bar' | \
mysql -uUSERNAME -pPASSWORD DATABASE