场景
刚开始做数据库适配的时候,这是一个棘手的问题,因为MySQL的库里,表结构,字段都是最新的,但是金仓的库,全是旧版本的表结构。需要把我们模块的表结构,同步到金仓中。
虽然金仓有数据库同步工具,但是直接把所有表都给同步过来,难免会影响到其他模块。
然后就写了一个工具类来进行这一操作。
原理:获取MySQL中,指定的某几张表,通过程序,获取表的字段,字段类型,长度,注释,主键,索引,标注释等等,然后生成金仓中的可执行SQL,自动执行。
(ps由于,工具类纯自己手写,因此设置了vip文章,非vip成员要获取联系作者)
首先先看一下金仓的创建表语法和删除表语法:
这俩个语法和MySQL不同,包括创建表时,给字段加注释,给表加注释的方式都不同!
创建表:
给字段加注释,直接在字段后面用 comment 'xxxxx'会报错,同样给表加注释直接在表的后面指定comment也会报错,必须要在语句的最后统一指定,试了好多次错才找到解决方法。
举个例子:
CREATE TABLE "PUBLIC"."rec_a01_his" ("A00" VARCHAR(36 char) NOT NULL PRIMARY KEY,"R0101" VARCHAR(60 char) NULL ,"R0102" VARCHAR(10 char) NULL ,"R0103" VARCHAR(10 char) NULL ,"R0104" DATE NULL ,"RECTYPEID" VARCHAR(100 char) NULL ,"DELETEFLAG" VARCHAR(2 char) NULL DEFAULT 0,"CREATETIME" TIMESTAMP NULL ,"CREATEUSER" VARCHAR(36 char) NULL ,"UPDATETIME" TIMESTAMP NULL ,"UPDATEUSER" VARCHAR(36 char) NULL
)
WITH (OIDS=FALSE
);
COMMENT ON TABLE "PUBLIC"."rec_a01_his" IS '基本情况';
COMMENT ON COLUMN "PUBLIC"."rec_a01_his"."R0101" IS '姓名';
COMMENT ON COLUMN "PUBLIC"."rec_a01_his"."R0102" IS '性别';
COMMENT ON COLUMN "PUBLIC"."rec_a01_his"."DELETETIME" IS '删除时间';
COMMENT ON COLUMN "PUBLIC"."rec_a01_his"."DELETEUSER" IS '删除人';
CREATE INDEX "rec_a01_his_rectypeid" ON "PUBLIC"."rec_a01_his" (RECTYPEID);
删除表:如果存在就删除,不存在执行也不报错
DROP TABLE IF EXISTS "rec_a01_his" CASCADE;
案例
下面提供的工具接口中 一共有三个接口:(支持一次输入多张表,多个表名之间用英文逗号分隔)
第一个:根据输入的表名,输出/控制台打印出可执行的新建表SQL。
第二个:根据输入的表名,输出/控制台打印出可执行的删除表SQL。
第三个:根据输入的表名,先删除这张表,再重新从MySQL中获取结构,然后再通过建表SQL进行新建。
No1:
发请求:rec_test为测试表
控制台输出:
可以直接复制到金仓去执行。
No2:
rec_test为测试表,生成它的删除语句,这个比较简单