如何从MySQL数据库中删除所有空表,只留下至少有1条记录的表?
编辑:这是我在mysqlclient中使用Python 3所做的事情
import MySQLdb
conn = MySQLdb.connect(
host='localhost', user='root',
passwd='mypassword', db='mydatabase'
)
c = conn.cursor()
c.execute('SHOW TABLES')
for row in c.fetchall():
table_name = row[0]
c.execute(f'SELECT * FROM {table_name}')
if c.rowcount == 0:
# c.execute(f'DROP TABLE {table_name}')
print(f'DROP TABLE {table_name}')发布于 2010-08-24 20:23:44
和一个完整的PHP版本。它不会丢弃任何东西,只需为您打印drop语句:
<?php
$username="root";
$password="mypassword";
$database="mydatabase";
mysql_connect('localhost',$username,$password);
mysql_select_db($database) or die( "Unable to select database");
function drop_empty_tables(){
$tables = mysql_query('SHOW TABLES');
while($table = mysql_fetch_array($tables)){
$table = $table[0];
$records = mysql_query("SELECT * FROM $table");
if(mysql_num_rows($records) == 0){
// mysql_query("DROP TABLE $table");
echo "DROP TABLE $table;\n";
}
}
}
drop_empty_tables();
?>发布于 2012-02-05 05:21:45
使用Percona工具包中的pt-find:
$ pt-find --dblike "mydatabase" --empty --exec-plus "DROP TABLE %s"发布于 2009-10-18 13:18:42
这个存储过程应该能做到这一点:
DELIMITER $$
DROP PROCEDURE IF EXISTS `drop_empty_tables_from` $$
CREATE PROCEDURE `drop_empty_tables_from`(IN schema_target VARCHAR(128))
BEGIN
DECLARE table_list TEXT;
DECLARE total VARCHAR(11);
SELECT
GROUP_CONCAT(`TABLE_NAME`),
COUNT(`TABLE_NAME`)
INTO
table_list,
total
FROM `information_schema`.`TABLES`
WHERE
`TABLE_SCHEMA` = schema_target
AND `TABLE_ROWS` = 0;
IF table_list IS NOT NULL THEN
SET @drop_tables = CONCAT("DROP TABLE ", table_list);
PREPARE stmt FROM @drop_tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END IF;
SELECT total AS affected_tables;
END $$
DELIMITER ;当有太多空表时,该GROUP_CONCAT可能会出现问题。这取决于group_concat_max_len系统变量的值。
因为DROP TABLE不能接收来自SELECT查询的参数,所以不可能在一个查询中做到这一点。
InnoDB笔记
感谢James的评论。在InnoDB表的情况下,行计数查询似乎不会返回精确的结果,因此当该模式中有InnoDB表时,不能保证上面的过程能够完美地工作。
对于InnoDB表,行计数只是在
优化中使用的粗略估计。(如果InnoDB表已分区,也是如此。)
https://stackoverflow.com/questions/1584804
复制相似问题