2

我想保留 t1,t2 并删除所有其他表。

4

2 回答 2

7

您可以使用它information_schema来查找表名,甚至可以将结果格式化为一堆DROP语句。

SELECT CONCAT('DROP TABLE ', TABLE_NAME, '; ')
  FROM information_schema.tables
  WHERE table_schema = DATABASE() AND table_name NOT IN ('foo', 'bar', 'baz');

(该DATABASE()函数返回当前use'd 数据库。)

使用PREPAREand EXECUTE,您甚至可以避免复制和粘贴,并且(在 MySQL 5.0.13 及更高版本中)编写一个存储过程来执行此操作。

于 2009-09-21T12:59:10.143 回答
1

您可以使用 mysqldump 生成 DROP TABLE 语句列表,过滤掉您不想要的语句,然后将其通过管道传回 mysql 客户端。这是我们如何建立它的

首先,这是数据库的 DROP TABLE 表语句列表

mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \
grep ^DROP 

现在我们可以通过带有 -v 的 grep 管道来反转匹配 - 我们想要不提及我们保留的表的语句(另一种方法是 mysqldump 的 --ignore-table 选项)

mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \
grep ^DROP |  
grep -v 'foo\|bar'

最后,一旦你有信心,你可以把它传回 mysql

mysqldump -uUSERNAME -pPASSWORD--add-drop-table --no-data DATABASE| \
grep ^DROP | \ 
grep -v 'foo\|bar' | \
mysql -uUSERNAME -pPASSWORD DATABASE
于 2009-09-21T13:00:45.660 回答