mysql租户字段默认值不支持表达式问题记录

背景信息

某客户有个工单系统底层用的oracle数据库应用中也没有过度依赖oracle的功能,为了满足信创客户打算一步到位迁移到 OB mysql 租户中并且希望应用基本不改,生成迁移评估报告后看到数据库侧只有基本的表、索引对象,但是在迁移时遇见了oracle那边有指定默认值为表达式在 OB mysql 租户中出现报错问题,本文简单记录下本次问题。

迁移报错

本次迁移是通过 OMS 迁移,值得一说的是现在OMS支持源端从Oracle迁移到目标端 OB mysql 点倒是符合客户的需求。但是在结构迁移步骤已经报错,排查后发现oracle的建表语句的字段默认值存在表达式,但是在 OB mysql 中创建失败,原始建表语句如下

create table t1(
c1 varchar(255) default to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') ,
c2 varchar(255)
);

手动改造后的建表语句,结果执时出现语法报错

create table t1(
c1 varchar(255) default convert(now(),char) ,
c2 varchar(255)
);

1729853180

这块尝试了几种写法,convert函数、cast函数都试过还是不行,然后我在原生mysql中也试了下这种语法,发现果然也不支持那么果断放弃。经过上面测试发现不管是OB mysql 还是原生mysql既然都无法支持那么就只有转换思路,第一时间想到的当然是去掉默认值后配合触发器来实现这个功能

create table t1(
c1 varchar(255) default convert(now(),char) ,
c2 varchar(255)
);
Delimiter $$
CREATE TRIGGER trigger_t1_insert before  INSERT ON t1 FOR EACH ROW
  BEGIN
    set new.c1=convert(now(),char);
END;
$$

实测后满足需求,客户可以在不改动应用的情况下访问数据库

测试之后果然可行,这样应用也不用改动满足了客户的需求

1729954036

总结

其实部分客户有这种oracle语法迁移到mysql语法的场景,这种坑在评估报告中不好体现需要慢慢解决,虽然原生mysql确实不支持字段默认值为表达式,但是感觉OB能支持的话也算一个可圈可点的特性。


请使用浏览器的分享功能分享到微信等