我必须将数据库表中的数据与来自sql查询的新数据同步,我需要删除不在新数据中的当前条目,并插入不在当前数据中的新条目。我能够使用这个伪代码在java中执行此操作:
// 1) get all data in database and store it in list (currentList)
// 2) get new data obtained through sql query and store it in list (newList)
// 3) sync both list
for(entry : currentList) {
if(newList.contains(entry))
finalList.add(entry)
}
for(entry : newList) {
if(!finalList.contains(entry))
finalList.add(entry)
}
// 4) delete all data from DB
// 5) insert finalList data to DB
它运行正常但是,我认为处理大量数据时会出现性能问题,因为我正在删除所有内容并重新插入整个列表而不是仅插入新条目并删除新条目中未找到的条目数据
你能建议一个更好的方法吗?是否可以创建一个可以处理数据同步的SQL查询?
答案 0 :(得分:1)
看看MERGE。
该构造允许您指定更新现有记录或添加新记录的条件。
它基本上看起来像:
MERGE
INTO target_table
USING source_table
ON (some condition)
WHEN MATCHED
( UPDATE some_update_statement )
WHEN NOT MATCHED
( INSERT some_insert_statement )
答案 1 :(得分:0)
您还可以在存储过程中执行这些操作,以免不必要地增加数据库流量。
然而,这不适用于大量条目(比如数百万条目)或者每个条目都是非常大的条目。在这种情况下,尝试使用上面Ryan指出的MERGE操作。
考虑以下PL / SQL伪代码(您可能希望根据您的使用情况进行更改):
PROCEDURE replace_with_list (newList) AS
BEGIN
/* Delete all the entries that are not present in the newList (e.g. by ID) */
/* Insert all the entries that present in newList and not present in your table */
END;