我不确定,但我认为此查询中有错误:
UPDATE product_discount SET price = '10,15' WHERE key_id = '1,2'
我无法弄清楚为什么,但它只更新了列中的第10个并跳过了15。
答案 0 :(得分:4)
我认为这就是你所需要的(假设Price
时key_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
上有一个唯一的键约束(例如,它是主键)尽管使用这些限制,但这种方法相对于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
元组将成为难以理解的垃圾。您可以根据需要执行的更新次数编写一些辅助函数来格式化query
和params
,但需要多长时间?理解有多容易?你会在所有这些额外的代码行中引入多少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