Mysql删除表名中有特殊字符的表

  由于公司业务和应用的调整,之前在Mysql中的很多表都不需要了,故需要对数据库进行整理。
 
   刚开始,我在想:不就删除一些表吗?很好解决,写个简单的脚本就可以了。我先看了数据库中有80000多个表,很多表都是以IP命名的,而这些表就是要清理的对象。
 
   于是我使用下面一条命令,先将所有表名导出到一个文件中:
 
   mysql -uroot -p123456 -A -e "use cdn;show tables;" >allDBName.txt
 
   然后,执行:cat allDBName.txt|grep "^[0-9]\{1,3\}\.[0-9]\{1,3\}\.">ipDB.txt 将以IP开始的表名导入到ipDB.txt中。再使用如下脚本,进行删除。
 
   #! /bin/bash
 
   cat ipDB.txt|while read DBname
 
   do
 
   mysql -uroot -p123456 -A -e "use cdn;DROP TABLE IF EXISTS $DBname;" 2》drop.err
 
   if [ $? -ne 0 ] ;then
 
   echo "Drop $DBname failed"
 
   fi
 
   done
 
   exit 0
 
   我在后台执行了以上脚本,也没看执行是否正确,个人感觉应该没问题了,于是就做其它事情去了。可是,一段时间后,我在information_schema数据库下,执行下列语句,查看数据库大小时,发现与删除表之前的数据库大小不减,反而增加了(实际环境中,正在跑着业务)。
 
   select concat(round(sum(DATA_LENGTH/1024/1024),2),'MB') as datasize from TABLES where table_schema='cdn';
 
   再看刚才脚本的目录下,多了一个drop.err文件,发现里面全是同一个错误:
 
   ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''192.168.1.30'' at line 1
 
   我很疑惑,为什么会报错呢?于是我在终端中进入到数据库,执行:
 
   DROP TABLE IF EXISTS '192.168.1.30';
 
   可是还是报相同的错误,我很是疑惑。WHY?根本就没道理啊,没有语法错误啊!后来仔细一想,感觉不对:表名里面的点一概失算特殊字符,可能是这个问题。于是我查阅了一些资料,遇到这种问题的解决方法是:把表名放到``里面,注意`是跟字母在一起的数字1的左边的字符,试了一下,果然成功了托福答案 www.qcwy123.com
 
   于是,我将脚本中的 $DBname变成`$DBname`,但是中兴的时候,居然又报错了:command not found,仔细一想应该是双引号的问题,于是将引号改成单引号,胆码如下:
 
   #! /bin/bash
 
   cat ipDB.txt|while read DBname
 
   do
 
   mysql -uroot -p123456 -A -e 'use cdn;DROP TABLE IF EXISTS `$DBname`;' 2》drop.err
 
   if [ $? -ne 0 ] ;then
 
   echo "Drop $DBname failed"
 
   fi
 
   done
 
   exit 0
 
   然后执行,没有再报错,问题应该解决了吧!可我一查看标的数量,居然还是没有变化,天理何在啊!没报错了,但怎么就没将表删除了。再仔细想想,原来是shell脚本中特殊字符的处理,改成以下就好了:
 
   #! /bin/bash
 
   cat ipDB.txt|while read DBname
 
   do
 
   mysql -uroot -p123456 -A -e "use cdn;DROP TABLE IF EXISTS \`$DBname\`;" 2》drop.err
 
   if [ $? -ne 0 ] ;then
 
   echo "Drop $DBname failed"
 
   fi
 
   done
 
   exit 0
 
   此时,再次执行,没报错,再看看表的数量,果然变少了。居然被几个符号搞了一天!唉!吸取点教训吧!
 
 

转载于:https://www.cnblogs.com/tianchaoy/p/3579859.html

<think>嗯,用户想在MySQL控制台里删除数据中的某一列。好的,首先我得回忆一下怎么用SQL语句来删除列。记得ALTER TABLE语句可以用来修改结构,删除列的话应该是用DROP COLUMN子句吧。对的,基本语法应该是ALTER TABLE DROP COLUMN 列;。 不过得确认用户是不是有权限执行这个操作,还有删除列会导致数据丢失,所以可能需要提醒他们先备份数据。另外,如果很大,删除操作可能会耗时,或者有外键约束的话,可能会有问题。不过用户的问题看起来比较基础,可能只是需要基本步骤,所以先给出简单的步骤,再补充注意事项。 需要分步骤说明,确保用户能理解。比如第一步是备份数据,第二步是执行ALTER TABLE语句,第三步是验证结果。可能还要提到如果列不存在会报错,所以最好先检查列是否存在。或者使用IF EXISTS来避免错误,但MySQL的ALTER TABLE DROP COLUMN是否支持IF EXISTS呢?好像MySQL在8.0版本之后才支持,所以可能需要说明不同的版本情况。 还要注意语法正确,比如列是否需要反引号,如果有特殊字符的话可能需要。还有例子中的和列应该用具体的例子,比如alter table users drop column age;这样的实例。用户可能对SQL不太熟悉,所以例子要具体明确。 另外,可能需要提醒用户删除列是不可逆的操作,确保他们真的需要删除该列。如果有应用程序依赖该列,删除后可能会导致错误。这些注意事项对用户来说很重要,避免误操作。 总结一下,回答的结构应该是先给出基本语法,然后步骤说明,包括备份、执行语句、验证,然后是注意事项,比如备份、影响、约束、版本差异等。这样用户能一步步跟着操作,同时了解潜在的风险和问题。</think>在MySQL控制台中删除数据中的某一列,可以按照以下步骤操作: --- ### **步骤 1:备份数据(重要!)** 删除列是高风险操作,建议先备份数据: ```sql -- 备份整个(需替换和备份) CREATE TABLE 备份 LIKE 原; INSERT INTO 备份 SELECT * FROM 原; ``` --- ### **步骤 2:使用 `ALTER TABLE` 语句删除列** 通过 `ALTER TABLE ... DROP COLUMN` 语法删除指定列: ```sql -- 基本语法(替换和列) ALTER TABLE DROP COLUMN 列; ``` #### **示例** 假设要删除 `users` 中的 `age` 列: ```sql ALTER TABLE users DROP COLUMN age; ``` --- ### **步骤 3:验证删除结果** 检查结构是否已更新: ```sql DESC ; ``` 或更详细地查看: ```sql SHOW CREATE TABLE ; ``` --- ### **注意事项** 1. **数据丢失** 删除列会永久删除该列的所有数据,请确保已备份或不需要此数据。 2. **外键约束** 如果列被其他的外键引用,需先删除外键约束。 3. **语法兼容性** - MySQL 8.0+ 支持 `IF EXISTS` 避免列不存在时报错: ```sql ALTER TABLE DROP COLUMN IF EXISTS 列; ``` - 低版本需手动检查列是否存在。 4. **性能影响** 对大型操作可能耗时较长,建议在低峰期执行。 --- ### **扩展场景** 若需要同时删除多列(效率更高): ```sql ALTER TABLE DROP COLUMN 列1, DROP COLUMN 列2; ``` --- 通过以上步骤,可以安全地删除MySQL中的指定列。如有疑问,建议先在测试环境验证操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值