database-ddl-generator

根据数据字典生成或审查多种数据库的建表、约束和注释 SQL;适用于达梦、MySQL、PostgreSQL、Oracle、SQL Server、SQLite、Hive 和 ClickHouse。

SKILL.md

GitHub

跨数据库 DDL 生成

目标与边界

根据用户提供的数据字典或既有 DDL,生成可执行、可审查的 .sql 文件。输出必须以用户指定的数据库为准;若未指定,先根据数据字典、现有脚本、连接信息或用户上下文判断,仍无法可靠判断时先询问,而不是生成“通用 SQL”。

本 skill 聚焦建表、字段、主键/唯一键/外键、索引和注释。权限、分区、存储引擎、表空间、分布式参数、触发器和初始化数据只有在数据字典或用户明确要求时才生成。

读取与规范化数据字典

接受 Excel、CSV、Markdown 表格、Word/PDF 中的字段表或结构化文本。先识别每张表的:表名、表注释、字段名、字段注释、逻辑类型、长度/精度/小数位、是否可空、默认值、主键、唯一键、外键、索引和字典顺序。

  • 保持数据字典的表顺序和字段顺序;未提供顺序时,保持输入出现顺序。
  • 表名、字段名默认转为大写;若目标数据库、数据字典或用户明确要求大小写敏感标识符,保留原样并使用该数据库正确的引用方式。
  • 区分默认值和字符串文本:日期函数、数字、NULL、布尔值等不得错误加引号。
  • 遇到不完整类型、缺失长度、歧义主键或冲突约束时,生成“待确认清单”,不得臆造生产约束。

字段映射和交付检查模板见 references/data-dictionary-contract.md。

目标数据库判断

优先级为:用户明确指定 > 连接配置/现有 SQL > 数据字典元信息 > 可识别的方言特征。输出开头必须写明“目标数据库及版本(若已知)”与采用的关键假设。

不要仅根据某个类型名推断数据库;例如 VARCHAR 出现在多种方言中。若需要支持未列出的数据库,先查阅其官方 SQL 文档或要求用户确认版本与兼容模式。

跨数据库 DDL 迁移与兼容修正

当输入是某个源数据库的 DDL,目标是另一种数据库时,先识别源数据库、目标数据库及其版本/兼容模式,再转换;不得仅做关键词替换,也不能假定源 DDL 可直接在目标端执行。

  1. 解析源 DDL 的表、字段、约束、索引、注释、默认值、分区和方言专属子句;保留源文件和原始对象顺序。
  2. 生成“源-目标兼容性清单”,逐项记录已自动转换、需人工确认和无法等价转换的内容。
  3. 按目标方言重建 DDL,并遵循其注释、标识符与对象创建顺序规则。
  4. 输出迁移后的 .sql,另附兼容性说明;不得把注释、存储引擎、表空间或分区等无效语法原样带入目标数据库。

迁移时至少处理以下差异:

  • **标识符:**模式/库名前缀、引用符、大小写折叠、最大长度、保留字和特殊字符;
  • **类型:**文本、二进制、精确小数、浮点、日期时间、时区、布尔、大对象与自定义类型;
  • **默认值:**当前时间/日期函数、序列函数、布尔字面量、字符串转义与 NULL 语义;
  • 自增主键:AUTO_INCREMENT、IDENTITY、序列、生成列或 UUID 的目标端实现;
  • **约束与索引:**命名、唯一/检查/外键约束、索引方法、部分索引、函数索引和创建时机;
  • **表级特性:**字符集、排序规则、引擎、表空间、存储参数、分区、集群/分布键和临时表选项;
  • **注释:**将源端内联或扩展属性注释改写为目标端可持久保存的方式。

对于无等价实现的特性,保留为带 TODO 的 SQL 注释并写入待确认清单;例如 MySQL 存储引擎、SQL Server 文件组、PostgreSQL 部分索引、Hive 分区语义或目标端不支持的自定义类型。不要为了让脚本“能执行”而静默丢失约束或改变数据语义。

跨库迁移时必须读取 references/ddl-migration.md。

生成顺序

对每张表按数据字典顺序生成:

  1. CREATE TABLE,包含字段及能够内联的约束;
  2. 无法内联或需独立维护的约束、索引;
  3. 表与字段注释,按照目标方言的规则安排;
  4. 以空行分隔表,所有语句以分号结束。

除非用户要求,生成前不包含 DROP TABLE。如需重复执行,使用目标数据库支持的安全幂等写法;不能假设各方言都支持 IF NOT EXISTS。

注释和方言规则

生成前必须读取 references/dialect-rules.md。尤其是:

  • **达梦(DM):**先完成整条 CREATE TABLE,再使用独立的 COMMENT ON TABLE 和 COMMENT ON COLUMN 语句;注释不得夹在建表语句中。
  • **Oracle、PostgreSQL:**建表后使用独立 COMMENT ON 语句。
  • **SQL Server:**建表后使用 sp_addextendedproperty(或在已有属性时使用相应更新逻辑)。
  • **MySQL、Hive、ClickHouse:**优先采用各自支持的内联 COMMENT 语法。
  • **SQLite:**没有标准的持久字段/表注释机制;在 SQL 文件中保留说明性注释,并在交付说明中明确该限制。

类型与兼容性

先保留数据字典中的物理类型;只有逻辑类型需要落地时才映射。映射时区分文本、整数、精确小数、浮点、日期/时间、二进制、布尔和大对象,并特别校验长度、精度、小数位和时区语义。类型映射与高风险差异见 references/dialect-rules.md。

不要把任意 NUMBER、DECIMAL 或 NUMERIC 机械映射为浮点数;金额和精确指标优先使用精确小数类型。未给出长度的文本字段或未给出精度的小数应标记待确认,除非用户已有明确的默认规范。

校验与交付

输出前逐项核验:

  • 表、字段和注释数量与数据字典一致;
  • 名称大写及引用规则符合目标方言;
  • 主键、外键、唯一键、默认值、可空性和索引没有遗漏;
  • 注释语句的位置与目标数据库兼容;
  • 保留字和特殊字符已处理;
  • 生成的 SQL 已按表/字段字典顺序排列。

跨库迁移额外核验:源端对象数量与目标端对象数量、关键字段类型与精度、主键/唯一/外键、索引、默认值和注释均有转换结论;所有无法自动迁移的项均出现在兼容性清单中。

将最终结果保存为描述性 .sql 文件,文件开头写明目标数据库、生成日期、数据字典来源和待确认项。交付时附上简短的兼容性与假设说明。