MySql建表脚本转CK

前置知识

主要是类型的转换、和空、非空的问题

整形

  • ClickHouse则直接使用Int8、Int16、Int32和Int64指代4种大小的Int类型,其末尾的数字正好表明了占用字节的大小(8位=1字节)

  • mysql中: int(M)的作用于int的范围明显是无关的,int(M)只是用来显示数据的宽度,我们能看到的宽度。当字段被设计为int类型,那么它的范围就已经被写死了(-2147483648~2147483647),与M无关。



CK的NOT NULL、NULL和Nullable的区别

  1. 如果字段声明为 not null它的默认值已由它的类型而定,不允许再为其设置默认值,比如int为0,String为空串。不需要显式声明
  2. 如果字段显式声明为null,默认值为NULL。
  3. 如果字段声明为Nullable,默认为NULL,可设置默认值,损耗性能。
/*** @Author yhchen* @Date 2022/3/8 10:22*/
public class MysqlToCK2 {public static void main(String[] args) {//将sql复制到这里String createTable = "DROP TABLE IF EXISTS `runoob_tbl`;\n" +"CREATE TABLE IF NOT EXISTS `runoob_tbl`(\n" +"   `runoob_id` int UNSIGNED AUTO_INCREMENT,\n" +"   `runoob_title` VARCHAR(100) NOT NULL,\n" +"   `runoob_author` VARCHAR(40) NOT NULL,\n" +"   `submission_date` DATE,\n" +"   PRIMARY KEY ( `runoob_id` )\n" +")ENGINE=InnoDB DEFAULT CHARSET=utf8;";System.out.println("请检查语句,不要有空行 也就是只有'\\n'");String res = changeMysqlTableToClickHouse(createTable);System.out.println("转换后的建表语句为:");System.out.println(res);System.out.println("需要删除ENGINE的上一行最后的一个逗号");}public static String changeMysqlTableToClickHouse(String tableName) {String tables = tableName;String primaryKey = "`id`";//默认idString[] rows = tables.split("\n");StringBuilder replaceTables = new StringBuilder();Boolean haveKey = false;int i = 0;for (String row : rows) {// 注释,不处理if (row.contains("--")) {replaceTables.append(row + "\n");continue;}if (row.contains("KEY")) {if (row.contains("PRIMARY")) {haveKey = true;primaryKey = row.substring(row.indexOf("(") + 1, row.indexOf(")"));}// 跳过、不添加continue;}if (row.contains("ENGINE=InnoDB")) {// 引擎替换row = ") ENGINE = ReplacingMergeTree";}// 无关删除String changeRow = row.replaceAll("AUTO_INCREMENT", "").replaceAll("CHARACTER SET utf8mb4", "").replaceAll("CHARACTER SET utf8", "").replaceAll("ON UPDATE CURRENT_TIMESTAMP", "").replaceAll("CURRENT_TIMESTAMP", "").replaceAll("( DEFAULT CHARSET).*", "")// 时间替换.replaceAll("datetime DEFAULT NULL", " DateTime ").replaceAll(" datetime ", " DateTime ");/*String规则*/// 为空,字符串changeRow = changeRow.replaceAll("(` ).*(char).*(DEFAULT NULL)", "` String NULL");changeRow = changeRow.replaceAll("(` ).*(char).*(DEFAULT '')", "` String");// changeRow = changeRow.replaceAll("(DEFAULT '')", "NULL");// 非空,字符串changeRow = changeRow.replaceAll("(` ).*(char).*(NOT NULL)", "` String");changeRow = changeRow.replaceAll("text", "String");changeRow = changeRow.replaceAll("(DEFAULT NULL)", "NULL");changeRow = changeRow.replaceAll("(NOT NULL)", "");// 以空格分割String[] changeColumns = changeRow.split("[ ]");//      System.out.println(changeRow);// 含有int的替换规则if (changeColumns[3].contains("int") || changeColumns[3].contains("bigint")||changeColumns[3].contains("INT")) {changeColumns[3].replaceAll("INT","int");changeColumns[3].replaceAll("BIGINT","bigint");// 将括号内的数字拿出来int length = Integer.parseInt(changeColumns[3].replaceAll("bigint", "").replaceAll("tinyint", "").replaceAll("int", "").replaceAll("\\(", "").replaceAll("\\)", ""));// 获取数据类型String type = changeColumns[3].substring(0, changeColumns[3].indexOf("("));// 处理int 是否可以为空值String last = " NULL";String[] _int = {"Int8", "Int16", "Int32", "Int64"};if (changeRow.contains("DEFAULT NULL")) {changeRow = changeRow.replaceAll("DEFAULT NULL", "");for (int j = 0; j < _int.length; j++) {_int[j] = _int[j] + last;}}if ("tinyint".equals(type)) {changeRow = changeRow.replaceFirst(type + "\\(" + length + "\\)", _int[0]);} else if ("smallint".equals(type)) {changeRow = changeRow.replaceFirst(type + "\\(" + length + "\\)", _int[1]);} else if ("int".equals(type) || "mediumint".equals(type)) {changeRow = changeRow.replaceFirst(type + "\\(" + length + "\\)", _int[2]);} else {changeRow = changeRow.replaceFirst(type + "\\(" + length + "\\)", _int[3]);}}replaceTables.append(changeRow.trim() + "\n");if (i == 0) {replaceTables.append("\n");}i++;}if (replaceTables.toString().contains(",) ENGINE = Memory")) {String temp = replaceTables.substring(0, replaceTables.indexOf(",) ENGINE = Memory"));replaceTables = new StringBuilder(temp + ") ENGINE = Memory ");}replaceTables.toString().replaceAll("CREATE TABLE `" + tableName + "`", tableName + "_local");if (haveKey) {replaceTables.append("PRIMARY KEY " + primaryKey);}replaceTables.append("\nORDER BY " + primaryKey);replaceTables.append(";");return replaceTables.toString();}
}

Mysql建表脚本转ClickHouse建表脚本相关推荐

  1. mysql 建表脚本 shell_shell 数据库建表语句脚本

    #!/bin/sh SHELL_NAME=GetTabStript.sh /bin/rm -f CreateTable.sql /bin/rm -f tmp.sql ##获取数据库用户名.密码.实例, ...

  2. ClickHouse MergeTree表引擎和建表语句

    1. Clickhouse使用场景 ClickHouse是由俄罗斯Yandex公司开发的.面向列的数据库管理系统(DBMS),主要面向OLAP场景,用于在线分析处理查询,可以使用SQL查询实时生成数据 ...

  3. mysql 分库分表 建表_【分库分表】sharding-jdbc实践—分库分表入门

    一.准备工作 1.准备三个数据库:db0.db1.db2 2.每个数据库新建两个订单表:t_order_0.t_order_1 DROP TABLE IF EXISTS`t_order_x`;CREA ...

  4. 用mysql建销售订单主表_mysql订单表如何设计?

    mysql订单表如何设计? 商品表和订单表 . 通过一个表来关联. 那删除了商品,相关联的订单表如何显示出这个已经删除的商品? 订单表需要冗余商品名.商品编号.价格等基本信息. 不能只保存一个商品主键 ...

  5. clickhouse中bitmap在用户标签,访客去重生产中使用及clickhouse建表null值数据类型处理

    clickhouse中bitmap的使用对于用户标签及用户,访客跨维度去重统计是十分合适的选择,具有更快的查询效率. 1.bitmap bitmap建表方式: create table test.bi ...

  6. 使用java代码编写脚本,把oracle建表语句变成hive建表语句

    使用java代码编写脚本,把oracle建表语句变成hive建表语句 java代码 测试oracle.sql 生成hive创表语句 java代码 import java.io.File; import ...

  7. Mysql系列课程--第三章 建表 插数据

    数据库模型图 /班级表/ CREATE TABLE `class` (`c_no` int(11) NOT NULL AUTO_INCREMENT,`c_name` varchar(45) NOT N ...

  8. clickhouse建表,字段类型设置为可为null类型

    clickhouse建表,字段类型设置为可为null类型 基于对clickhouse中的表进行插入或者更新操作时,对于null值插入或者更新出现的问题进行处理,所以在建表的时候对字段进行表明,设置为可 ...

  9. mysql 建表 日期格式_MySQL建表时,日期时间类型选择

    MySQL(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示 DA ...

最新文章

  1. P1541 乌龟棋 题解(洛谷,动态规划递推)
  2. matlab 方波_matlab实现方波与三角波波形
  3. Windows 技术篇-LDSGameMaster文件夹有什么用,删除方法
  4. 【模型部署】风控模型部署相关知识
  5. 快速排序伪代码_数据结构和算法之快速排序
  6. 将数据从一个表剪切到另一个表中
  7. windows10 python3.5 opencv3
  8. TensorFlow和ML前5名的课程
  9. Flume整合Kafka采集滚动的日志
  10. mac地址容量的作用_S6520X+MAC地址容量检查命令
  11. [转载] 向集合中添加自定义类型--建议在自定义类型的时候要重写equals方法
  12. 腾讯视频主演角色弹幕怎么发
  13. 机器学习实战11-训练深层神经网络
  14. mqtt服务器收不到设备信息,在我的终端(mosquitto)上显示来自mqtt服务器的json消息...
  15. SpringBoot高级篇JdbcTemplate之数据查询上篇
  16. 三分钟免费搞定网站在线客服,利用PowerTalkBox控件制作而成,为大家提供比较好的示例...
  17. python自动获取北京时间_python实现定时同步本机与北京时间的方法
  18. MongoDB-Getting Started with the C# Driver
  19. 搭建国外海外多语言一元云购软件夺宝购商城网站
  20. 【单片机基础篇】51单片机流水灯

热门文章

  1. 没钱开发VS肆意挥霍,揭秘“穷项目”和“富项目”差距有多大?
  2. spring boot 源码解析31-AuthenticationAuditListener,AuthorizationAuditListener
  3. WINDOW -- m2硬盘装win10系统遇到的问题
  4. 融云艾瑞发布《政企数智办公平台行业研究报告》,解读数智化时代的办公新趋势
  5. mac可执行文件被误操作删除
  6. 闲鱼除了每天擦亮怎么能获得曝光?
  7. 一切围绕信任——闲鱼无忧购的技术演进
  8. 分布式电商项目——4.搭建微信公众号平台以及整合WxJava框架提供注册码
  9. Box818开箱即开即取的CSGO皮肤开箱子网站
  10. 惠普光影精灵_Windows11换成Windows10