MySQL表不会更新多行

时间:2014-03-28 16:56:31

标签: mysql sql sql-update

我不确定,但我认为此查询中有错误:

UPDATE product_discount SET price = '10,15' WHERE key_id = '1,2' 

我无法弄清楚为什么,但它只更新了列中的第10个并跳过了15。

4 个答案:

答案 0 :(得分:4)

我认为这就是你所需要的(假设Pricekey_id = 1应为10:

UPDATE product_discount SET price = CASE WHEN key_id = 1 THEN 10 ELSE 15 END
WHERE key_id IN (1,2) 

答案 1 :(得分:2)

您可以尝试this answer中建议的方法:

INSERT INTO product_discount (key_id, price) 
VALUES (1, 10), (2, 15)
ON DUPLICATE KEY UPDATE price=VALUES(price);

请务必阅读链接的答案以获取一些警告;例如,这只适用于:

  • key_id上有一个唯一的键约束(例如,它是主键)
  • 您知道具有这些ID的行已经存在,或者如果您提供表中不存在的ID,则不要介意插入新行

尽管使用这些限制,但这种方法相对于CASE语句的显着优势是更好的可读性和参数化。例如,在Python中,您可以使用MySQLdb模块执行@ Kaf答案中给出的查询:

query = """UPDATE product_discount SET price = CASE 
    WHEN key_id = %s THEN %s ELSE %s 
    END 
WHERE ID IN (%s, %s);"""

params = (1, 10, 15, 1, 2)

cursor.execute(query, params)

要让某人从params元组中弄清楚您想要更新哪些值,以及它们的值应该是多少,需要多长时间?如果你想更新两行以上怎么办?您不仅需要为N行的每个用例重写query,如果N超过少数几个,params元组将成为难以理解的垃圾。您可以根据需要执行的更新次数编写一些辅助函数来格式化queryparams,但需要多长时间?理解有多容易?你会在所有这些额外的代码行中引入多少bug?

另一方面,您可以使用INSERT ... ON DUPLICATE KEY UPDATE方法执行此操作:

query = """INSERT INTO product_discount (key_id, price) VALUES (%s, %s)
ON DUPLICATE KEY UPDATE price=VALUES(price);"""
params = [(1, 10),
          (2, 15),
          ]
cursor.executemany(query, params)

键值关系清晰且具有高可读性。如果需要更新更多行,可以将更多键值元组添加到参数列表中。对于每种情况,它都不是一个完美的解决方案,但它比CASE更好的解决方案(我认为,非常常见)方案。

答案 2 :(得分:1)

我认为Kaf很接近,但有时候key_id可能是3或4或5对吗?因此,您需要确保这些值不会更改为15.这应该可以解决问题!

UPDATE product_discount 
SET price = CASE WHEN key_id = 1 THEN 10 
                 WHEN key_id = 2 THEN 15 
                 ELSE price END

答案 3 :(得分:1)

我觉得你要做的是

  当key_id = 1时,

更新价格= 10   (OR)
  当key_id = 2时,price = 15。

在这种情况下,就像

一样
UPDATE product_discount SET price = 
CASE WHEN key_id = 1 THEN 10 
WHEN key_id = 2 THEN 15
ELSE price
END