我很好奇如果我有一个外部系统提供的ID列表,那么更新数据库中多行的最佳做法是什么?
简单UPDATE table SET y=z WHERE id IN (?);
不是我们可以获得超过数千个ID的方式,这是Oracles的限制。
当然我们有一些想法,比如分成多个查询,使用临时表和EXIST条件,但Id喜欢看最佳实践并了解背后的理论。
编辑:这个问题不是最快答案的竞赛,而是关于最佳实践及其理论背景。 ID由外部系统提供!没有其他表可用于加入或其他选择。通过临时表我的意思是全局临时表(oracle功能),而不是为每个查询创建anf drop new table!请不要因为你想要快速或者你没有明白这一点而回答。
答案 0 :(得分:0)
你能用吗?
UPDATE table
SET a.column=b.column
FROM table a
JOIN your_id_table b ON a.id=b.id
您如何填写IN
条款中的“(?)”?
答案 1 :(得分:0)
您可能在另一个表中有列表
UPDATE table
SET y=z
WHERE id IN (SELECT ID
FROM YourOtherTable);
也可以使用exists
UPDATE table T1
SET y=z
WHERE Exists (SELECT ID
FROM YourOtherTable T2
WHERE T2.ID = T1.ID);
答案 2 :(得分:0)
编辑:我假设您使用Java进行更新。
创建临时表是否需要更长时间,用您的ID填充它然后执行它? (或许我误解了这个场景)。
我要做的是将大的ID列表拆分成分区,然后使用执行程序将批次提交到我的数据库层,例如:
ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(10);
List<Integer> aLotOfIds = new ArrayList<Integer>(); // imagine heaps of IDS
List<List<Integer>> partition = Lists.partition(aLotOfIds, 1000);
partition.forEach( p -> {
newFixedThreadPool.submit(() -> {
// execute update for a batch
});
});