我有表SQLite数据库myTable
和列id
, posX
, posY
。 行的数量在不断的变化(可能会增加或减少)。 如果我知道的值id
的每一行,并且行数,我可以执行一个SQL查询来更新所有的posX
和posY
根据ID不同值的字段?
例如:
---------------------
myTable:
id posX posY
1 35 565
3 89 224
6 11 456
14 87 475
---------------------
SQL查询的伪代码:
UPDATE myTable SET posX[id] = @arrayX[id], posY[id] = @arrayY[id] "
@arrayX
和@arrayY
是存储为新的值的阵列posX
和posY
字段。
如果,例如, arrayX
和arrayY
包含以下值:
arrayX = { 20, 30, 40, 50 }
arrayY = { 100, 200, 300, 400 }
......那么查询数据库后应该是这样的:
---------------------
myTable:
id posX posY
1 20 100
3 30 200
6 40 300
14 50 400
---------------------
这可能吗? 现在我更新每个查询一列,但它要采取数百查询作为行数增加的。 我的方式做这一切在空气中。
有一对夫妇的方式, 体面有效做到这一点。
第一 -
如果可能的话,你可以做一些批量插入到一个临时表。 这一定程度上取决于你的RDBMS /主机的语言,但在最坏的情况这可以用一个简单的动态SQL(使用完成VALUES()
子句),然后一个标准的更新-从-另一个表。 大多数系统批量加载提供实用工具,虽然
二 -
而这在某种程度上依赖于关系型数据库,以及,你可以建立一个动态更新语句。 在这种情况下,在VALUES(...)
的CTE内部的条款已经在即时创建:
WITH Tmp(id, px, py) AS (VALUES(id1, newsPosX1, newPosY1),
(id2, newsPosX2, newPosY2),
......................... ,
(idN, newsPosXN, newPosYN))
UPDATE TableToUpdate SET posX = (SELECT px
FROM Tmp
WHERE TableToUpdate.id = Tmp.id),
posY = (SELECT py
FROM Tmp
WHERE TableToUpdate.id = Tmp.id)
WHERE id IN (SELECT id
FROM Tmp)
(根据文档,这应该是有效的SQLite的语法,但我不能让它在小提琴工作)
是的,你可以做到这一点,但我怀疑这会提高性能,除非你的查询有一个真正的大的延迟。
你可以这样做:
UPDATE table SET posX=CASE
WHEN id=id[1] THEN posX[1]
WHEN id=id[2] THEN posX[2]
...
ELSE posX END, posY = CASE ... END
WHERE id IN (id[1], id[2], id[3]...);
的总成本由下式给出更多或更少:NUM_QUERIES *(COST_QUERY_SETUP + COST_QUERY_PERFORMANCE)。 这样一来,你击倒在NUM_QUERIES了一点,但COST_QUERY_PERFORMANCE上升BIGTIME。 如果COST_QUERY_SETUP真的是巨大的(例如,你调用一些网络服务,这是真正的慢),那么,是的,你可能仍然结束了在上面。
否则,我会用索引的ID,或修改架构尝试。
在MySQL中,我认为你可以用多个INSERT对重复密钥更新这样做更容易(但我不知道,没试过)。
像这样的东西可能会为你工作:
"UPDATE myTable SET ... ;
UPDATE myTable SET ... ;
UPDATE myTable SET ... ;
UPDATE myTable SET ... ;"
如果任何POSX或波西值是相同的,那么它们可以合并成一个查询
UPDATE myTable SET posX='39' WHERE id IN('2','3','40');
以“更新平板尝试集(行= '值' 其中id = 0001 '),(行=' 值' 其中id = 0002' ),...