SymmetricDS升级后MySQL到H2表定义适配问题求助
一、TIMESTAMP类型长度警告问题
问题说明
升级SymmetricDS到3.15.2、H2到2.1.214后,创建客户端节点时出现警告:Source column 'TIMESTAMP' with size of 19 exceeds maximum of 9 for type TIMESTAMP,SymmetricDS生成的H2语句为"TIMESTAMP" TIMESTAMP(9),需要改为无精度的"TIMESTAMP" TIMESTAMP。
解决办法
修改表定义XML的平台适配
在现有XML列定义中新增H2平台专属配置,指定类型为TIMESTAMP且不设置size:<column name="timestamp" type="TIMESTAMP" size="19"> <platform-column name="mysql" type="TIMESTAMP" size="19"/> <platform-column name="h2" type="TIMESTAMP"/> </column>配置后SymmetricDS为H2生成表结构时,会使用无精度的TIMESTAMP类型,规避长度超出警告。
配置SymmetricDS类型映射规则
在客户端的symmetric.properties中添加H2类型映射配置,覆盖默认TIMESTAMP转换逻辑:db.h2.type.mapping.TIMESTAMP=TIMESTAMP该配置会让SymmetricDS处理H2数据库时,将通用TIMESTAMP类型直接映射为H2原生的无精度TIMESTAMP。
二、自增值重置与语法兼容问题
问题说明
MySQL中带复合主键(自增列+其他列)的表,SymmetricDS为H2生成的表使用nextval序列,已有数据时新增记录自增值会从1开始,且H2官方不再推荐nextval语法,需改用GENERATED BY DEFAULT AS IDENTITY。
解决办法
调整SymmetricDS自增列配置
在表定义XML的自增列中添加H2平台专属配置,指定使用IDENTITY语法:<column name="kid" primaryKey="true" required="true" type="INTEGER" size="10" autoIncrement="true"> <platform-column name="mysql" type="INT" size="10"/> <platform-column name="h2" type="INTEGER" autoIncrement="true" identity="true"/> </column>配置后SymmetricDS会为H2生成符合官方推荐标准的自增列定义:
"KID" INTEGER NOT NULL GENERATED BY DEFAULT AS IDENTITY,手动初始化自增起始值(针对已有数据场景)
若表中已有数据,创建H2表后需手动设置IDENTITY起始值为现有最大ID+1:ALTER TABLE KURSE ALTER COLUMN KID RESTART WITH (SELECT MAX(KID)+1 FROM KURSE);避免新增数据时自增值从1开始引发主键冲突。
MySQL表结构优化(可选)
若允许调整MySQL表结构,可将复合主键拆分:自增列设为单独主键,creator设为联合唯一约束(业务允许的情况下),这样SymmetricDS对H2自增列的处理会更贴合H2原生支持,减少适配问题:CREATE TABLE `kurse` ( `kid` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `creator` varchar(30) NOT NULL DEFAULT 'web', `start` time NOT NULL, `ende` time NOT NULL, UNIQUE KEY `uk_kurse_creator_kid` (`kid`,`creator`) );
内容的提问来源于stack exchange,提问作者Marcel

