基于多表关联查询将MSSQL数据迁移至H2DB并添加计算列
解决方案
1. 先在H2DB创建含新增计算列的目标表
根据MSSQL四张表的结构,在H2DB中创建目标表,包含原有业务字段+需要存入计算结果的新增列。假设四张表为A、B、C、D,关联逻辑为A.id=B.a_id、B.id=C.b_id、C.id=D.c_id,新增计算列total_amount,示例建表语句:
CREATE TABLE target_table ( id INT PRIMARY KEY, a_name VARCHAR(100), b_quantity INT, c_discount DECIMAL(10,2), d_note VARCHAR(200), -- 新增存储计算结果的列 total_amount DECIMAL(12,2) );
2. 编写关联查询+计算的迁移逻辑
核心是从MSSQL拉取关联后的数据,同时完成计算,再插入H2DB。以下是两种常用实现方式:
方式1:用数据库工具跨库直接迁移
在支持跨库连接的工具(如DataGrip、DBeaver)中,同时连接MSSQL和H2DB,执行跨库插入语句:
-- 直接从MSSQL拉取关联计算后的数据插入H2DB INSERT INTO h2_schema.target_table (id, a_name, b_quantity, c_discount, d_note, total_amount) SELECT A.id, A.name, B.quantity, C.discount, D.note, -- 自定义计算逻辑,根据实际需求修改 (A.unit_price * B.quantity) * (1 - C.discount/100) AS total_amount FROM mssql_schema.A JOIN mssql_schema.B ON A.id = B.a_id JOIN mssql_schema.C ON B.id = C.b_id JOIN mssql_schema.D ON C.id = D.c_id -- 可选:添加过滤条件缩小迁移范围 WHERE A.create_time >= '2024-01-01';
方式2:程序中转(适合复杂计算场景)
用JDBC分别连接MSSQL和H2DB,先从MSSQL执行关联查询获取结果集,完成自定义计算后批量插入H2DB。核心代码片段(Java示例):
// 1. 从MSSQL查询关联数据 String mssqlQuery = "SELECT A.id, A.name, B.quantity, C.discount, D.note, A.unit_price FROM A JOIN B ON A.id=B.a_id JOIN C ON B.id=C.b_id JOIN D ON C.id=D.c_id"; PreparedStatement mssqlStmt = mssqlConn.prepareStatement(mssqlQuery); ResultSet rs = mssqlStmt.executeQuery(); // 2. 批量插入H2DB String h2Insert = "INSERT INTO target_table (id, a_name, b_quantity, c_discount, d_note, total_amount) VALUES (?, ?, ?, ?, ?, ?)"; PreparedStatement h2Stmt = h2Conn.prepareStatement(h2Insert); h2Conn.setAutoCommit(false); while (rs.next()) { // 执行计算逻辑 BigDecimal total = rs.getBigDecimal("unit_price") .multiply(BigDecimal.valueOf(rs.getInt("quantity"))) .multiply(BigDecimal.ONE.subtract(rs.getBigDecimal("discount").divide(BigDecimal.valueOf(100)))); // 填充参数 h2Stmt.setInt(1, rs.getInt("id")); h2Stmt.setString(2, rs.getString("name")); h2Stmt.setInt(3, rs.getInt("quantity")); h2Stmt.setBigDecimal(4, rs.getBigDecimal("discount")); h2Stmt.setString(5, rs.getString("note")); h2Stmt.setBigDecimal(6, total); h2Stmt.addBatch(); } h2Stmt.executeBatch(); h2Conn.commit();
3. 关键注意事项
- 数据类型兼容:MSSQL的
NVARCHAR对应H2的VARCHAR,DATETIME对应TIMESTAMP,DECIMAL需保证精度一致 - 关联逻辑验证:迁移前单独在MSSQL执行关联查询,确认无笛卡尔积、数据匹配正确
- 计算结果校验:先抽取小批量数据验证计算逻辑,确保结果符合预期
- 批量优化:大数据量迁移时,关闭自动提交、使用批量插入提升效率
内容的提问来源于stack exchange,提问作者pooja b
相关产品推荐
相关产品推荐

