AnyLine DDL 全量支持

面向数百种数据库的结构定义语言统一适配方案

为什么DDL全量支持如此困难

数据库有数百种,仅国产库就有数十种。每种数据库的DDL语法都存在差异,即使是同一SQL标准的不同实现也有细节不同。DDL差异不是简单的语法替换,而是语义层面的适配。 开源版8.7.3仅覆盖了主流数据库的基础DDL,商业版本的工作重点在于国产库和特种库的深度适配。

DDL差异全景图——按问题类别

3.1 数据类型映射

差异维度 典型表现 适配策略
类型名称不同 BOOLEAN在有的库是BOOL,有的库是TINYINT/NUMBER(1),有的库不支持 自动类型映射矩阵
参数语义不同 VARCHAR(n)的n在有的库是字符数,有的库是字节数;DECIMAL精度上限不同 参数语义转换
特有类型 某些库有CLOB/NCLOB、JSONB、MONEY、UUID、INTERVAL等特有类型 特有类型降级/升级映射
时间类型分化 DATETIME/TIMESTAMP/TIMESTAMPTZ精度不同,时区支持不同 时区参数扩展支持
空间类型差异 GEOMETRY/GEOMETRY(POINT)/SDO_GEOMETRY等,子类型体系完全不同 空间类型子类型映射
大字段类型 BLOB/CLOB/TEXT/LONGTEXT/BINARY/VARBINARY/BYTEA映射复杂 按功能需求选择映射
自增列 IDENTITY/SERIAL/AUTO_INCREMENT/SEQUENCE四种实现方式 统一抽象为自增语义
数值类型 TINYINT/SMALLINT/INT/BIGINT/NUMBER/NUMERIC/DECIMAL各库支持范围不同 精度安全映射

3.2 标识符与命名规则

差异维度 典型表现 适配策略
大小写敏感性 有的库默认全大写,有的默认小写,有的保留原始大小写 统一标识符处理策略
引号规则 双引号保留大小写、反引号、方括号、无引号,各库不同 自动选择引号方式
命名长度限制 表名/列名最大长度从30到128不等 自动截断或警告
保留字冲突 各库保留字列表不同,同一个词在A库是保留字在B库不是 保留字检测与自动加引号
特殊字符 有的库支持中文命名,有的不支持;下划线/数字开头的规则不同 命名合法性检查

3.3 建表语法差异

差异维度 典型表现 适配策略
存储引擎/表类型 有的库支持指定存储引擎、列存储、堆表等 条件生成或忽略
表空间指定 部分库要求或支持TABLESPACE子句,部分库不支持 按目标库条件生成
临时表语法 GLOBAL TEMPORARY/LOCAL TEMPORARY/TEMP/SESSION等不同语法 语法自动转换
存储参数 STORAGE/FILLFACTOR/PCTFREE等各库特有参数 参数映射或忽略
分区表定义 分区语法差异最大 独立适配层
默认值函数 CURRENT_TIMESTAMP/SYSDATE/NOW()/GETDATE()各不同 函数方言转换
ON UPDATE支持 部分库支持ON UPDATE CURRENT_TIMESTAMP,部分不支持 不支持时降级为触发器
列计算/生成列 GENERATED ALWAYS AS / VIRTUAL COLUMN / 计算列,支持程度不同 按支持程度生成

3.4 索引类型差异

差异维度 典型表现 适配策略
聚集索引 部分库主键默认聚集,部分库需显式指定CLUSTER INDEX,部分库无此概念 映射策略:按目标库语义生成
位图索引 仅部分库支持,其他库需降级为普通索引 特性检测+降级
函数索引 部分库直接支持,部分库需用生成列模拟 特性检测+替代方案
反向索引 仅少数库支持 降级为普通索引
全局/局部索引 分区表上的索引作用域,部分库支持GLOBAL/LOCAL,部分无区分 条件生成
并发建索引 CREATE INDEX CONCURRENTLY / ONLINE / 不支持 特性检测+条件生成
部分索引 WHERE条件的索引,仅部分库支持 不支持时忽略
包含列索引 INCLUDE子句,仅部分库支持 不支持时降级
唯一约束与索引关系 部分库自动建索引,部分库不自动建 行为统一

3.5 分区表差异——最复杂的适配层

差异维度 典型表现 适配策略
分区类型支持 范围/列表/哈希分区各库基本支持;间隔分区仅部分库支持 特性检测+降级
子分区 部分库支持多级子分区,部分库不支持 不支持时合并为单层分区
分区数量限制 各库对分区数量上限不同 合规检查
分区维护操作 SPLIT/MERGE/EXCHANGE/ADD/DROP分区语法各不同 方言转换
默认分区 DEFAULT分区/OTHERS分区的语法和行为不同 方言映射
分区键限制 部分库要求分区键必须包含在主键中 约束检测与调整
分区索引 全局索引/局部索引的创建和语义差异 条件生成
分区与约束交互 唯一约束与分区键的关系,各库规则不同 约束兼容性检查

3.6 约束实现差异

差异维度 典型表现 适配策略
外键级联操作 ON DELETE/UPDATE CASCADE/SET NULL/SET DEFAULT/NO ACTION,各库支持组合不同 按支持程度降级
延迟约束 DEFERRABLE/INITIALLY DEFERRED仅部分库支持 不支持时转为即时约束
约束启用/禁用 ENABLE/DISABLE CONSTRAINT仅部分库支持 不支持时用其他方式实现
约束验证模式 VALIDATE/NOVALIDATE仅部分库支持 降级处理
CHECK约束 表达式语法差异,部分库不支持子查询 表达式兼容性检查
唯一约束与NULL 多个NULL在唯一约束中的行为各库不同 行为统一或警告

3.7 其他DDL对象差异

对象类型 差异概述 适配策略
序列 CREATE SEQUENCE语法基本相似,但缓存、循环、步长等选项有差异 选项映射
视图 CREATE VIEW基本一致,可更新视图支持程度不同 功能检测
同义词 部分库支持SYNONYM,部分库不支持 不支持时用VIEW替代
存储过程/函数 语法差异极大,PL/SQL、PL/pgSQL、T-SQL等完全不同体系 语言级转换(长期目标)
触发器 语法和时机(BEFORE/AFTER/INSTEAD OF)支持不同 条件生成
物化视图 部分库支持,部分库不支持 降级为普通表+定时刷新
注释 COMMENT ON语法不同,部分库用行内注释 方言转换
枚举类型 部分库原生支持ENUM,部分库需用CHECK约束模拟 类型映射

还需要单独实现的功能

4.1 高优先级(信创项目刚需)

功能 说明 预估工作量
分区表DDL完整支持 范围/列表/哈希/间隔/子分区,含SPLIT/MERGE/EXCHANGE 约4-6周
数据类型扩展参数 时间类型时区参数、VARCHAR的byte/char语义、空间类型子类型 约3-4周
标识符统一处理 大小写敏感、引号规则、保留字检测、命名合法性检查 约2周
默认值函数转换 SYSDATE/NOW()/GETDATE()/CURRENT_TIMESTAMP等跨库转换 约2周
ON UPDATE降级 不支持的库自动生成触发器替代方案 约1周
表空间参数自动生成 需要指定TABLESPACE的库自动添加 约1周
元数据查询统一 系统表/信息模式差异导致的元数据查询不统一 约3周
兼容模式检测 自动检测数据库兼容模式,选择生成策略 约2周

4.2 中优先级(提升兼容性)

功能 说明 预估工作量
索引类型降级策略 位图索引→普通索引、函数索引→生成列模拟、反向索引→普通索引 约2周
约束降级策略 延迟约束→即时约束、ENABLE/DISABLE→重建约束 约2周
存储过程/函数DDL 跨库存储过程语法差异极大,最复杂的长期目标 约4周+
同义词适配 支持的库直接创建,不支持的用VIEW替代 约1周
部分索引/包含列索引 按目标库支持程度条件生成 约1周
全局/局部索引 分区表索引作用域映射 约1周

4.3 低优先级(完善体验)

功能 说明 预估工作量
并发建索引 CONCURRENTLY/ONLINE按库条件生成 约3天
存储参数映射 FILLFACTOR/PCTFREE/STORAGE等各库特有参数 约3天
触发器DDL 各库语法差异适配 约2周
物化视图 支持的库直接创建,不支持的降级为普通表 约2周
枚举类型映射 ENUM→CHECK约束的自动转换 约3天
可更新视图检测 各库可更新视图规则不同 约1周

实现架构

AnyLine DDL 统一API
DDL抽象元数据 ← 统一中间表示
方言适配层
方言适配层
方言适配层

...数百种

特性检测
模式检测
版本检测

← 自动识别

降级策略引擎
不支持 → 替代方案
部分支持 → 条件生成
完全支持 → 直接生成
1
中间抽象层
DDL先转AnyLine元数据,再按目标库生成方言SQL
2
特性检测
运行时自动检测目标库版本、兼容模式、支持特性
3
降级策略可配置
不支持的特性自动降级为替代方案
4
差异报告
每次DDL生成附带兼容性报告

总结

三层工作占比

层次 工作内容 占比
语法层 各库DDL语法差异的转换 30%
语义层 不支持特性的降级策略 40%
元数据层 大小写、类型映射、系统表差异 30%