3

我正在寻找一种简单的方法来根据该行首先是否存在来查询更新或插入。我现在正在尝试使用 Python 的 MySQLdb。这就是我执行查询的方式:

self.cursor.execute("""UPDATE `inventory`
                          SET `quantity` = `quantity`+{1}
                        WHERE `item_number` = {0}
                    """.format(item_number,quantity));

我已经看到了四种方法来实现这一点:

  1. 重复密钥。不幸的是,主键已经被用作唯一 ID,所以我不能使用它。

  2. 代替。和上面一样,我相信它依赖于一个主键才能正常工作。

  3. mysql_affected_rows(). 通常您可以在更新行后使用它来查看是否有任何影响。我不相信 Python 中的 MySQLdb 支持此功能。

  4. 当然最后的努力是:做一个 SELECT 查询,fetchall,然后根据结果更新或插入。基本上我只是想将查询保持在最低限度,因此现在 2 个查询而不是 1 个查询不太理想。

基本上我想知道在选择选项 4 之前是否错过了任何其他方法来完成此任务。感谢您的时间。

4

1 回答 1

2

Mysql 确实允许您拥有唯一索引,如果任何唯一索引有重复项,而不仅仅是 PK,则 INSERT ... ON DUPLICATE UPDATE 将进行更新。

但是,我可能仍然会选择“两个查询”的方法。你是在交易中这样做的,对吧?

  1. 进行更新
  2. 检查受影响的行,如果为 0,则执行插入

或者

  1. 尝试插入
  2. 如果由于唯一索引冲突而失败,请进行更新(注意:您需要检查错误代码以确保它没有因其他原因而失败)

如果行通常已经存在,则前者很好,但如果您在事务之外执行此操作或隔离模式不够高,则可能导致竞争(或死锁)情况。

在您的库存表中创建 item_number 的唯一索引对我来说听起来是个好主意,因为我想(不知道您的架构的详细信息)一个项目应该只有一个库存级别(假设您的系统不允许多个库存地点等)。

于 2009-11-26T08:01:02.850 回答