# 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-08-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Merge-Insert SQL 工具 一个用 Go 语言编写的工具,用于处理 SQL INSERT 语句的合并与拆分。 ## 功能特性 1. **合并模式 (merge)**: - 将多个单条 INSERT/INSERT IGNORE/REPLACE 语句合并为批量语句 - 支持通过 `--title` 参数控制合并后语句的前缀类型 - 保持非 INSERT 语句原样不变 - 正确处理 INSERT ... SELECT 语句(保持原样) 2. **拆分模式 (split)**: - 将批量 INSERT 语句拆分为单条语句 - 保持语句原有前缀类型不变 - 保持非 INSERT 语句原样不变 3. **格式保持**: - 保持原始语句的大小写格式 - 保持原始语句的位置和换行 - 不会对读取到的字符进行额外的转义或修改 ## 使用方法 ### 编译程序 ```bash go build -o merge-insert . ``` ### 命令行参数 - `--input-file`:输入文件路径(必需) - `--output-file`:输出文件路径(必需) - `--batch`:批量合并的行数(默认100) - `--mode`:操作模式,merge(合并)或 split(拆分),默认为 merge - `--title`:合并时的语句前缀类型(insert/ignore/replace),仅在 merge 模式下生效 ### 合并模式使用示例 ```bash # 基本合并 ./merge-insert --input-file=input.sql --output-file=output.sql --batch=100 --mode=merge # 合并并转换为 INSERT IGNORE 类型 ./merge-insert --input-file=input.sql --output-file=output.sql --batch=100 --mode=merge --title=ignore # 合并并转换为 REPLACE 类型 ./merge-insert --input-file=input.sql --output-file=output.sql --batch=100 --mode=merge --title=replace # 合并并转换为 INSERT 类型 ./merge-insert --input-file=input.sql --output-file=output.sql --batch=100 --mode=merge --title=insert ``` ### 拆分模式使用示例 ```bash # 拆分批量语句 ./merge-insert --input-file=batch_input.sql --output-file=single_output.sql --mode=split ``` ## 实现原理 ### 合并模式 (merge) 1. **语句识别**: - 识别 INSERT INTO、INSERT IGNORE INTO、REPLACE INTO 语句 - 识别 INSERT ... SELECT 语句(保持原样) - 识别其他 SQL 语句(保持原样) 2. **语句分组**: - 将相同表名和语句类型的 INSERT 语句分组 - 不同表或类型的语句分别处理 3. **语句合并**: - 对同一组的语句,提取 VALUES 部分并合并 - 按 `--batch` 参数指定的数量分批输出 - 根据 `--title` 参数确定输出语句前缀类型 4. **格式保持**: - 对于单行语句,保持原始格式不变 - 对于需要合并的语句,重新构建语句但保持字段和值的原始格式 ### 拆分模式 (split) 1. **语句识别**: - 识别包含多个 VALUES 的批量 INSERT 语句 - 识别其他 SQL 语句(保持原样) 2. **语句拆分**: - 将批量语句中的每个 VALUES 拆分为单独的语句 - 保持语句原有的前缀类型 3. **格式保持**: - 保持表名、字段和值的原始格式 - 保持语句原有的大小写格式 ## 支持的语句类型 ### 可合并/拆分的语句 1. `INSERT INTO table VALUES (...)` 2. `INSERT INTO table (fields) VALUES (...)` 3. `INSERT IGNORE INTO table VALUES (...)` 4. `INSERT IGNORE INTO table (fields) VALUES (...)` 5. `REPLACE INTO table VALUES (...)` 6. `REPLACE INTO table (fields) VALUES (...)` ### 保持原样的语句 1. `INSERT INTO table SELECT ...` 2. `INSERT IGNORE INTO table SELECT ...` 3. `REPLACE INTO table SELECT ...` 4. `SELECT ...` 5. `UPDATE ...` 6. `DELETE ...` 7. 其他非 INSERT 语句 ## 使用示例 ### 输入文件示例 ```sql INSERT INTO users (id, name) VALUES (1, 'Alice'); INSERT INTO users (id, name) VALUES (2, 'Bob'); INSERT INTO users (id, name) VALUES (3, 'Charlie'); INSERT IGNORE INTO products (id, name) VALUES (1, 'Product A'); INSERT IGNORE INTO products (id, name) VALUES (2, 'Product B'); REPLACE INTO testa VALUES (now()); REPLACE INTO testa VALUES ('value1'); INSERT INTO users SELECT * FROM temp_users; SELECT * FROM users; ``` ### 合并后输出(--batch=2) ```sql INSERT INTO users (id, name) VALUES (1, 'Alice'), (2, 'Bob'); INSERT INTO users (id, name) VALUES (3, 'Charlie'); INSERT IGNORE INTO products (id, name) VALUES (1, 'Product A'), (2, 'Product B'); REPLACE INTO testa VALUES (now()), ('value1'); INSERT INTO users SELECT * FROM temp_users; SELECT * FROM users; ``` ### 合并后输出(--batch=2 --title=ignore) ```sql INSERT IGNORE INTO users (id, name) VALUES (1, 'Alice'), (2, 'Bob'); INSERT IGNORE INTO users (id, name) VALUES (3, 'Charlie'); INSERT IGNORE INTO products (id, name) VALUES (1, 'Product A'), (2, 'Product B'); INSERT IGNORE INTO testa VALUES (now()), ('value1'); INSERT INTO users SELECT * FROM temp_users; SELECT * FROM users; ``` ### 批量语句输入 ```sql INSERT INTO users (id, name) VALUES (1, 'Alice'), (2, 'Bob'), (3, 'Charlie'); ``` ### 拆分后输出 ```sql INSERT INTO users (id, name) VALUES (1, 'Alice'); INSERT INTO users (id, name) VALUES (2, 'Bob'); INSERT INTO users (id, name) VALUES (3, 'Charlie'); ``` ## 注意事项 1. 程序只处理相同表和类型的 INSERT 语句合并 2. INSERT ... SELECT 语句不会被合并,保持原样 3. 在 split 模式下,--title 参数不生效 4. 程序保持原始语句的格式,包括大小写和位置 5. 程序不会对读取到的字符进行额外的转义或修改