公司项目上线,需要去掉原本数据库表上的注释。
一开始以为很简单的一个事情,实际操作之后,发现不是。
一开始想到的是 直接用一条sql语句执行一下就完事了,比如
USE your_database_name;
ALTER TABLE your_table_name COMMENT '';
运行发现,根本没用。
然后写了针对一个字段去注释的sql,ALTER TABLE sys_log MODIFY COLUMN log_admin VARCHAR(50) COMMENT '';
这个可以执行,但是你不能一条一条去写吧。
然后想到的办法是写个存储过程,循环执行一下alter,然后CALL一下,
CREATE PROCEDURE remove_field_comments()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE table_name VARCHAR(100);
DECLARE column_name VARCHAR(100);
DECLARE data_type VARCHAR(100);
DECLARE cur CURSOR FOR
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'struts2';
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN cur;
read_loop: LOOP
FETCH cur INTO table_name, column_name, data_type;
IF done THEN
LEAVE read_loop;
END IF;
SET @sql = CONCAT('ALTER TABLE `', table_name, '` MODIFY COLUMN `', column_name, '` ', data_type, ' COMMENT "";');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END LOOP;
CLOSE cur;
END //
但是执行的时候,拼接的那条sql报错,调试了很久,没成功,怀疑是data_type 变量,查询出来有问题为null。不过这个思路是正确的应该。
最后的办法,
同事写了个java小程序,原理是将数据库,导出数据结构后,解析那些CREATE TABLE 建表语句,获取其中字段,给拼接成大量的这种修改表字段的语句,然后去执行。这里感谢同事。
ALTER TABLE `as_parameter_test` MODIFY COLUMN
`delete_time` datetime DEFAULT NULL ;
ALTER TABLE `as_parameter_test` MODIFY COLUMN
`inserttime` datetime DEFAULT NULL ;
ALTER TABLE `as_parameter_test` MODIFY COLUMN
`insert_user` varchar(30) DEFAULT NULL ;
ALTER TABLE `as_parameter_test` MODIFY COLUMN
`updatetime` datetime DEFAULT NULL ;
ALTER TABLE `as_parameter_test` MODIFY COLUMN
`update_user` varchar(30) DEFAULT NULL ;
下方记录一下代码,估计以后也会用到,
package httpClient;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class comment {
public static void main(String[] args) {
replaceFileStr("C:\\Users\\liuyifeng\\Desktop\\xxx.sql","C:\\Users\\liuyifeng\\Desktop\\result.sql");
//replaceFileStr("C:\\Users\\Administrator\\Desktop\\material.sql","C:\\Users\\Administrator\\Desktop\\material_2.sql");
}
static void replaceFileStr(String path, String newFilePath) {
String reg = "";
String newtStr = "";
String fileStr = "";
StringBuffer stringBuffer = new StringBuffer();
try {
// 创建文件输入流
FileReader fileReader = new FileReader(path);
// 创建缓冲字符数组
char[] data = new char[1024];
StringBuilder sb = new StringBuilder();
// fis.read(data):将字符读入数组。在某个输入可用、发生I/O错误或者已到达流的末尾前,此方法一直阻塞。
// 读取的字符数,如果已到达流的末尾,则返回 -1
int rn = 0;
while ((rn = fileReader.read(data)) > 0) { // 读取文件内容到字符串构建器
String str = String.valueOf(data, 0, rn);// 把数组转换成字符串
sb.append(str);
}
// 生成字符串
fileStr = sb.toString();
String tableName = "";
String[] table = fileStr.split("CREATE TABLE `");;
String[] zd=null;
for (int i = 0; i < table.length; i++) {
if (!"".equals(table[i].trim()) && table[i].indexOf("CREATE") == -1) {
tableName = table[i].substring(0, table[i].indexOf("`"));
if(table[i].substring(table[i].indexOf("(") + 1).indexOf(",") != -1){
zd = table[i].substring(table[i].indexOf("(") + 1).split(",");
for (int j = 0; j < zd.length; j++) {
if(zd[j].trim().indexOf("COMMENT") != -1){
if (zd[j].trim().indexOf("`") == 0 ) {
stringBuffer.append("ALTER TABLE `").append(tableName).append("` MODIFY COLUMN ").append(zd[j].replace("\n", "").split("COMMENT")[0]).append(";\n");
}else if(zd[j].trim().indexOf("ENGINE") != -1) {
stringBuffer.append("ALTER TABLE `").append(tableName).append("` ").append(zd[j].replace("\n", "").split("COMMENT")[0].substring(zd[j].replace("\n", "").indexOf("ENGINE"))).append(" COMMENT=''").append(";\n");
}
}
}
}
}
}
// 创建文件输出流
FileWriter fileWriter = new FileWriter(newFilePath);
// 把替换完成的字符串写入文件内
fileWriter.write(stringBuffer.toString().toCharArray());
// 关闭文件流,释放资源
fileReader.close();
fileWriter.close();
System.out.println("执行完成");
} catch (IOException e) {
e.printStackTrace();
}
}
}
形成sql语句就是这样的