我有2个模式。
我想先在源模式中执行select查询,然后将结果集转换为merge语句,然后将其合并为目标模式。
有可能吗?
之所以不进行插入,是因为目标模式中已经存在记录的可能性,该记录在插入时会引发唯一约束。
再加上一点:源数据库和目标数据库位于不同的服务器上。
答案 0 :(得分:0)
有可能吗?
不确定您为什么认为这不可能。有什么具体原因吗?
我正在回答,因为您已经用 jdbc 对其进行了标记,这意味着您正在寻找与数据库无关的解决方案,并且仅使用Java。
合并意味着-如果目标数据库中已存在该行,则更新行,否则在目标数据库中插入新行(搜索条件为主键)。
因此,请在源数据库上运行select,对其进行迭代并在迭代循环中进行
WHERE
子句如果在目标数据库中找到结果,请创建一个UPDATE
PreparedStatement
,从源数据中的update prepare语句中设置值,然后添加到批处理中(即,不执行它)< / p>
如果在第2步中未找到任何行,请创建INSERT
PreparedStatement
,根据源数据在准备好的语句中设置值并添加到批处理中
或者,您可以尝试插入单个行,如果抛出约束冲突,请尝试在catch块中更新该行。使用这种方法,如上所述,insert&batch语句不能成批执行。
第三种方法是直接使用MERGE语句(如果目标数据库支持它),如图here所示,请看方法-public static void MergeTables(Connection conn)
。可以使用jdbc语句executeUpdate
方法执行MERGE。
请注意,以上步骤仅涉及在循环中运行步骤1的性能-可能有太多的DB调用需要大量数据。因此,此类工作通常在专门的ETL工具(Informatica等)或PL / SQL中完成。