我正在寻找一种简单的方法来查询更新或插入,基于该行是否存在于第一位。我现在正在尝试使用Python的MySQLdb。 这就是我执行查询的方式:
self.cursor.execute("""UPDATE `inventory`
SET `quantity` = `quantity`+{1}
WHERE `item_number` = {0}
""".format(item_number,quantity));
我已经看到了四种方法来实现这一目标:
DUPLICATE KEY。不幸的是,主键已被用作唯一ID,因此我无法使用它。
替换。与上述相同,我认为它依赖于主键才能正常工作。
mysql_affected_rows()
。通常,您可以在更新行后使用此选项以查看是否有任何影响。我不相信Python中的MySQLdb支持这个功能。
当然最后的努力:根据结果进行SELECT查询,取消,然后更新或插入。基本上我只是试图将查询保持在最低限度,因此2个查询而不是1个现在不太理想。
基本上我想知道在选择4之前我是否错过任何其他方法来完成这项工作。感谢您的时间。
答案 0 :(得分:2)
Mysql DOES允许您拥有唯一索引,INSERT ... ON DUPLICATE UPDATE将执行更新,如果任何唯一索引有重复,而不仅仅是PK。
但是,我可能仍然会采用“两种查询”的方法。你是在交易中这样做的,对吗?
OR
如果行通常已经存在,前者是好的,但是如果你在事务之外执行它或者你的隔离模式不够高,可能会导致竞争(或死锁)条件。
在库存表中创建item_number的唯一索引听起来对我来说是一个好主意,因为我想(不知道您的架构的细节)一个项目应该只有一个库存级别(假设您的系统没有允许多个库存地点等。)