C# MySQL 实现多层级联数据迁移
以下是针对C#和MySQL实现多层级联数据迁移的解决方案:
一、核心实现步骤
1、建立ID映射关系
使用Dictionary维护旧主键与新主键的映射关系
适用于所有具有自增主键的父表
Dictionary<int, int> parentIdMapping = new Dictionary<int, int>();
2、层级迁移顺序控制
按依赖关系确定迁移顺序(如:用户表 -> 订单表 -> 订单明细)
使用拓扑排序处理复杂依赖关系
3、数据迁移核心代码
using (var sourceConn = new MySqlConnection(sourceConnectionString))
using (var targetConn = new MySqlConnection(targetConnectionString))
{
sourceConn.Open();
targetConn.Open();
// 迁移父表数据
using (var transaction = targetConn.BeginTransaction())
{
try
{
// 示例:迁移用户表
var cmdSelect = new MySqlCommand("SELECT id, name FROM users", sourceConn);
using (var reader = cmdSelect.ExecuteReader())
{
while (reader.Read())
{
var insertCmd = new MySqlCommand(
"INSERT INTO users (name) VALUES (@name); SELECT LAST_INSERT_ID();",
targetConn, transaction);
insertCmd.Parameters.AddWithValue("@name", reader["name"]);
var newId = Convert.ToInt32(insertCmd.ExecuteScalar());
parentIdMapping.Add(reader.GetInt32(0), newId);
}
}
// 迁移子表(示例:订单表)
MigrateChildTable("orders", "user_id", parentIdMapping, sourceConn, targetConn, transaction);
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
}
4、外键关联更新方法
void MigrateChildTable(string tableName, string fkColumn,
Dictionary<int, int> idMapping,
MySqlConnection sourceConn, MySqlConnection targetConn,
MySqlTransaction transaction)
{
var cmd = new MySqlCommand($"SELECT * FROM {tableName}", sourceConn);
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
var insertCmd = new MySqlCommand(
$"INSERT INTO {tableName} ({fkColumn}, ...) VALUES (@newFk, ...)",
targetConn, transaction);
// 转换外键值
var oldFk = reader.GetInt32(fkColumn);
insertCmd.Parameters.AddWithValue("@newFk", idMapping[oldFk]);
// 添加其他参数...
insertCmd.ExecuteNonQuery();
}
}
}
二、关键注意事项
1、事务处理
使用MySqlTransaction确保原子性操作
异常时执行回滚操作
2、性能优化
启用Bulk Insert(使用MySqlBulkLoader)
分批次处理大数据量表(每次处理500-1000条)
3、自增主键处理
重置目标数据库的AUTO_INCREMENT值
ALTER TABLE target_table AUTO_INCREMENT = {new_value};
4、外键约束处理
迁移前禁用外键检查
SET FOREIGN_KEY_CHECKS = 0;
迁移完成后恢复
SET FOREIGN_KEY_CHECKS = 1;
三、复杂场景处理
1、多级嵌套关系
graph TD
A[部门表] --> B[员工表]
B --> C[项目表]
C --> D[任务表]
按层级顺序逐层迁移,每层生成新的ID映射表
2、循环依赖处理
临时存储关联关系
分阶段插入初始数据后更新关联字段
四、验证方案
数据一致性检查
// 验证记录数
var sourceCount = ExecuteScalar("SELECT COUNT(*) FROM source_table");
var targetCount = ExecuteScalar("SELECT COUNT(*) FROM target_table");
// 验证外键关联
var sql = @"SELECT COUNT(*) FROM child_table
WHERE NOT EXISTS (
SELECT 1 FROM parent_table
WHERE parent_table.id = child_table.parent_id
)";
var orphanRecords = ExecuteScalar(sql);
此方案通过维护ID映射表、控制迁移顺序和使用事务机制,可有效处理多层级联数据的迁移需求。建议在实际操作前使用测试环境进行全流程验证,并通过数据库备份保障数据安全。
如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。