你可以试试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 元组就会变成难以辨认的垃圾。您可以编写一些辅助函数来根据您需要执行的更新次数来格式化query 和params,但这需要多长时间?理解起来有多容易?你会在所有这些额外的代码行中引入多少错误机会?
另一方面,以下是使用 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)
键值关系清晰易读。如果需要更新更多行,可以将更多键值元组添加到 params 列表中。这不是每个场景的完美解决方案,但对于特定(我认为,非常常见的)场景,它比 CASE 更好的解决方案。