首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从MySQL数据库中删除所有空表?

问如何从MySQL数据库中删除所有空表?
EN

Stack Overflow用户
提问于 2009-10-18 12:47:48
回答 8查看 7.3K关注 0票数 10

如何从MySQL数据库中删除所有空表,只留下至少有1条记录的表?

编辑:这是我在mysqlclient中使用Python 3所做的事情

代码语言:javascript
复制
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}')
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-08-24 20:23:44

和一个完整的PHP版本。它不会丢弃任何东西,只需为您打印drop语句:

代码语言:javascript
复制
<?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();
?>
票数 3
EN

Stack Overflow用户

发布于 2012-02-05 05:21:45

使用Percona工具包中的pt-find:

代码语言:javascript
复制
$ pt-find --dblike "mydatabase" --empty --exec-plus "DROP TABLE %s"
票数 5
EN

Stack Overflow用户

发布于 2009-10-18 13:18:42

这个存储过程应该能做到这一点:

代码语言:javascript
复制
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表已分区,也是如此。)

来源:http://dev.mysql.com/doc/refman/5.1/en/tables-table.html

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1584804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档