去除mysql数据库表注释和表中字段注释

公司项目上线,需要去掉原本数据库表上的注释。
一开始以为很简单的一个事情,实际操作之后,发现不是。

一开始想到的是 直接用一条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语句就是这样的
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值