我在使用列表中的新值更新表时遇到问题。
我的数据如下:
id value_1 value_2
1 11 21
2 32 41
3 43 84
...
我已经在表中使用INSERT命令编写了列id和value_1。在那一步,我不能写value_2列,因为我仍然需要计算它,所以我想稍后使用value_2列的值数组更新表。
我想要一个像这样的代码:
UPDATE table_name SET value_2 = (21,41,84) WHERE id IN (1,2,3)
不幸的是,从列表中设置value_2不可能是这样的,它只适用于单个值。
我在整个UPDATE查询中编写了一个for循环的解决方法,但这对我的程序来说太慢了。 任何人都有建议如何让这个工作?
整个查询都是用Python执行的。
答案 0 :(得分:1)
在尝试不同的事情后,我可以找到一个解决方案,使用值列表作为输入快速更新表的值。
我以这个问题(https://stackoverflow.com/a/3466/7997169)中提出的想法为导向,并对其进行了修改以处理列表。
作为输入,我有这样的列表:
VALUES (1,11,21),(2,32,41),(3,41,84),....
使用Python MySQL连接器,我可以将整个更新循环写入一个查询命令。因此,我将列表中的数据写入一个如下所示的字符串:
for i in range(0,len(id),1):
a = '(' + str(id[i]) + ',' + str(value_1[i]) + ',' + str(value_2[i]) + ')'
b = ','
if i < (len(id)-1):
c = c + a + b
else:
c += a
update_cell_info = ("INSERT INTO table (id, value_1, value_2)"
"VALUES %s" % c +
"ON DUPLICATE KEY UPDATE "
"value_1=VALUES(value_1),"
"value_2=VALUES(value_2)"
";")
cursor.execute(update_cell_info)
总代码如下:
{{1}}
最后,这个过程比前一个过程快10倍,我使用for循环用新变量迭代更新过程。
答案 1 :(得分:0)
可以使用一个UPDATE
来完成,使用case
表达式来设置所需的值。像这样:
UPDATE table_name
SET value_2 = case id when 1 then 21
when 2 then 41
when 3 then 84
end
WHERE id IN (1,2,3)
但是,我不知道它是否会产生任何性能差异。