一次性删除 Mysql 数据库中所有表的数据,保留表结构

本贴最后更新于 1912 天前,其中的信息可能已经事过景迁

1、前言

常见的删除数据库表中数据的方法是通过 delete 或者 truncate 的方法进行删除操作,如果删除的是表中某一条或者部分数据的话适合用 delete 操作进行删除,如果要删除表中所有的数据的话,适合是同 truncate 进行删除操作。

那么问题来了,如果某一个数据库中有很多张表,此时我想将该数据库中所有表中的数据全部删掉,该如何操作呢?

解决该问题主要分两种情况,如果不需要保留数据库中所有表的结构,那么答案很简单,执行命令 drop database 数据库名 即可达到目的。但是如果需要保留该数据库中所有表的结构,只想删除所有表中的数据,又该怎么解决呢?有人会说可以多执行几次 truncate 操作就 OK 啦,没错,多执行几次 truncate 确实可以达到目的,但是,如果要删除的数据库中有很多张表,几十张上百张表,执行上百次 truncate 操作显然不是好的办法?至此,就是本文要说讲到的办法了。

2、删除方法

删除的办法其实还是执行 truncat 方法,只是不需要每次手动的输入 truncate 命令进行删除。通过 sql 命令的方式生成所有的 truncate 语句并写入到.sql 脚本文件中,然后执行脚本即可完成删除操作,并且保留了表结构。

生成 truncate 命令的 sql 语句为:

SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') FROM information_schema.TABLES WHERE TABLE_SCHEMA='test' into outfile '/tmp/truncate_test.sql';

然后将生成的.sql 脚本拷贝到当前文件夹下面:

mv /tmp/truncate_test.sql $current_dir/

然后执行.sql 脚本将数据库中所有表中数据删除:

source $current_dir/truncate_test.sql

3、说明:

在进行 select....into outfile......操作时,默认只能将文件写入到 tmp 路径下,可以不用将 tmp 文件夹下面的.sql 脚本移动到当前文件夹下,直接在 tmp 路径下执行.sql 脚本即可。如果要写入到其他路径下,需要给 mysql 的守护进程赋写操作的权限,最简单的办法是将/etc/selinux 路劲下的 config 配置文件中的 SELINUX 修改成 disabled 可以实现写入其他路径下,这里不展开说明。

4、运行效果

结合上一篇博文 mysql 数据库的备份和恢复,下面贴出一个小脚本的源码和运行截图。使用该脚本进行数据备份和恢复时,源和目的数据库中的所有表结构需要一致,否则执行可能出错。该脚本主要实现 mysql 数据库的备份和恢复,以及一次删除整个数据库中所有表数据并保留数据表结构。

运行结果截图说明:

1.bmp

  1. 备份 test 数据库中的所有数据
  2. 恢复数据
  3. 删除数据库 test 中所有表中的所有数据,并保留表结构

2.bmp

5、脚本源码:

#/bin/bash
while [ 1 ]
do
    echo "  #############################################" 
    echo "           Quick Backup and Recovery"                   
    echo "    Source and Destination Mysql Must Be Same"
    echo "  #############################################"
    echo "    1) Back up database test"
    echo "    2) Recovery database test"
    echo "    3) Clear data in database test"
    echo "    q) Quit"
    echo -n " Your Option:"
    read option_char
 
    current_dir=$(pwd)
    case ${option_char} in
        "1")
    	    rm -f $current_dir/test_bk.sql
            mysqldump -t -c -uroot -proot test > $current_dir/test_backup.sql
            echo " Database test already backup..."
            ;;
        "2")
            mysql -u root --password='root' -e "
	    use test
            source $current_dir/test_backup.sql"
            echo " Database test already recovery..."
            ;;
        "3")
            rm -f $current_dir/truncate_test.sql
	    chmod 777 $current_dir
            mysql -u root --password='root' -e "
            SELECT CONCAT('TRUNCATE TABLE ',TABLE_NAME,';') FROM information_schema.TABLES WHERE TABLE_SCHEMA='test' into outfile '/tmp/truncate_test.sql';"
	    mv /tmp/truncate_test.sql $current_dir/
    	    mysql -u root --password='root' -e "
	    use test
	    source $current_dir/truncate_test.sql"
            echo " Clear data of test successful..."
            ;;
        "q"|"quit"|"exit"|'Q'|"QUIT"|"Quit")
	    break
	    ;;
        *)
            echo "your option is invalid, please input again..."
            ;;
    esac
done
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    691 引用 • 535 回帖
  • 删除数据
    2 引用
  • 脚本
    20 引用 • 147 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...