# merge-insert-sql **Repository Path**: dbother/merge-insert-sql ## Basic Information - **Project Name**: merge-insert-sql - **Description**: 将单独的 insert 语句合并为批量的 insert语句 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-08-25 - **Last Updated**: 2025-12-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Merge-Insert SQL 工具 一个用 Go 语言编写的高性能工具,用于处理 SQL INSERT 语句的合并与拆分。 ## 核心特性 ### 1. 智能合并 (Merge Mode) - **多类型支持**:支持 `INSERT`、`INSERT IGNORE`、`REPLACE INTO` 语句的自动识别与合并。 - **批量控制**:通过 `--batch` 参数灵活控制每条批量语句包含的数据行数。 - **类型转换**:支持通过 `--title` 参数强制转换输出语句的前缀类型(如将普通 INSERT 转为 INSERT IGNORE)。 - **智能分组**:自动识别并分组相同表名、相同字段列表的语句进行合并。 - **安全透传**:智能识别 `INSERT ... SELECT`、`UPDATE`、`DELETE` 等非标准插入语句,保持原样输出,不破坏逻辑。 ### 2. 精准拆分 (Split Mode) - **批量拆单**:将一条包含多个 Values 的批量 `INSERT` 语句拆分为多条单行语句。 - **属性保持**:拆分后的语句保留原始的表名、字段列表和语句类型(如 IGNORE/REPLACE)。 ### 3. 健壮解析引擎 - **正则匹配**:使用正则表达式匹配 SQL 关键字,支持忽略大小写、忽略多余空白字符(如 `INSERT IGNORE INTO`)。 - **上下文感知**:实现了基于状态机的词法分析,能够正确处理: - 值中包含 `VALUES`、`SELECT`、`INSERT` 等关键字的情况。 - 表名或列名中包含关键字的情况。 - 包含单引号 `'`、双引号 `"` 及转义字符 `\` 的复杂字符串值。 - **多行支持**:完整支持跨越多行的 SQL 语句(如 XML/JSON 字符串换行),确保解析不中断、数据不丢失。 ### 4. 数据完整性验证 - **统计报告**:程序运行结束后输出详细的统计信息,包括处理的语句数、数据行数等。 - **自动校验**:自动对比输入和输出的数据行数(Values Count),确保在合并或拆分过程中**零数据丢失**。 ## 使用方法 ### 编译 ```bash go build -o merge-insert main.go ``` ### 命令行参数 | 参数 | 说明 | 默认值 | |------|------|--------| | `--input-file` | 输入 SQL 文件路径(**必需**) | - | | `--output-file` | 输出 SQL 文件路径 | `原文件名_merged.sql` 或 `_split.sql` | | `--batch` | 合并模式下,每条批量语句包含的最大行数 | `1000` | | `--mode` | 操作模式:`merge` (合并) 或 `split` (拆分) | `merge` | | `--title` | 强制指定输出语句类型:`insert`, `ignore`, `replace` | (保持原样) | ### 示例 #### 1. 合并 INSERT 语句 将 `input.sql` 中的单条插入语句合并为批量语句,每批 500 条: ```bash ./merge-insert --input-file input.sql --output-file output.sql --batch 500 ``` #### 2. 合并并转换为 INSERT IGNORE 将合并后的语句统一转换为 `INSERT IGNORE INTO ...`: ```bash ./merge-insert --input-file input.sql --title ignore ``` #### 3. 拆分批量语句 将 `dump.sql` 中的批量插入语句拆分为单条语句: ```bash ./merge-insert --input-file dump.sql --mode split ``` ## 统计报告示例 程序执行完成后会输出如下统计信息,帮助您确认数据完整性: ```text 文件处理完成 ---------------- 统计信息 ---------------- 处理模式: merge 输入 INSERT 语句数: 2500 输入数据行数 (Values): 2500 输出 INSERT 语句数: 3 输出数据行数 (Values): 2500 忽略/透传语句数: 0 ✅ 数据完整性验证通过:输入输出数据行数一致 ------------------------------------------ ``` ## 处理逻辑细节 1. **合并逻辑**: * 程序顺序读取文件。 * 遇到连续的、结构相同(同表、同类型、同字段)的 INSERT 语句时,缓存其 VALUES 部分。 * 当缓存数量达到 `batch` 大小,或遇到不同结构的语句,或文件结束时,将缓存的 VALUES 组合成一条批量语句写入输出文件。 * 对于不支持合并的语句(如 `INSERT ... SELECT`),会先刷新缓冲区,然后原样写入该语句。 2. **多行处理**: * 程序内置缓冲区,能够识别未以分号 `;` 结束的语句,将其累积直到语句完整闭合后再进行解析。 * 这确保了即使 SQL 语句中的字符串包含换行符,也能被正确解析为一个整体。 3. **特殊情况**: * 如果 SQL 文件中包含 `VALUES ('insert into')` 这样的字符串,程序能正确识别这是字符串值而不是新的语句开始。 * 如果输入文件最后一行没有分号,程序也会尝试将其作为最后一条语句处理。