当我想批量删除有共同前缀的数据表时,我发现MySQL的drop table 并不支持批量操作,我豪横的sql均有syntax error。
1. drop tables in
(select table_name
from information_schema.tables
where table_name like 'test%' and table_schema='db_name'
);
2.drop table like 'test%';
!错误示范,请勿模仿!模仿了也没事!
既然如此,把循环的事情交给shell做,MySQL每次还是drop一张表,脚本如下,
sh deltbbydbandprefix.sh db_name tb_prefix
运行。
#! /bin/bash
# deltbbydbandprefix.sh
#两个参数,参数1是db名字,参数2是表名前缀。
params=`echo $#`
echo "your input param is db=$1 and table prefix like $2"
if [ $params -lt 2 ]
then
echo "Too Many Params,Can Only Accept Two Params"
exit
fi
#连接MySQL并且获取前缀是$2的数据表
var=$(mysql -hhost_address -P3306 -uuser_name -ppwd -e"use '$1';show tables like '$2%';")
count=0
for i in $var;
do
let count=$count+1
if [ $count -ne 1 -a $count -ne 2 ]
then
#delete from db
echo "deleting ...$i"
mysql -hhost_address -P3306 -uuser_name -ppwd -e"use '$1';drop table $i"
fi
done
过滤掉第一行&第二行是因为:是表头,不是table名
1&2行
另外一种场景,随着业务的发展,开机上存在的很多数据表已经不用了,在线上db中已删除,如何在开发机上仅保存线上有的数据表,其它的都删除呢?easy easy
#! /bin/bash
# !注意 强行和线上有的table一致,可能误删本地table
#获取线上db中存在的表名列表
online_tables=$(mysql -honline_host_address -P3306 -uuser_name -ppwd -D db_name -e"show tables;")
local_tables=$(mysql -hlocal_host_address -P3306 -uuser_name -ppwd -D db_name -e"show tables;")
count=0
#read table names
for i in $local_tables;
do
let count=$count+1
if [ $count -ne 1 -a $count -ne 2 ] && [[ ! "$online_tables" =~ "$i" ]]
then
#delete from db
echo "deleting ...$i"
mysql -hlocal_host_address -P3306 -uuser_name -ppwd -D db_name -e "drop table $i"
fi
done
网友评论