列表

时间:2017-05-18 09:31:26

标签: mysql sql mysql-python

我在使用列表中的新值更新表时遇到问题。

我的数据如下:

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执行的。

2 个答案:

答案 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)

但是,我不知道它是否会产生任何性能差异。