【问题标题】:How to get the last row id on update?如何获取更新时的最后一行 ID?
【发布时间】:2015-01-03 03:40:12
【问题描述】:

我是 mysql 的初学者,可能是我在某个地方的错,并且无法理解如何解决这个问题。 这是我的表的结构:-

CREATE TABLE `nearest_product_type` (
    `id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY,
    `created` datetime NOT NULL,
    `modified` datetime NOT NULL,
    `name` varchar(15) NOT NULL UNIQUE
)
;

这是我正在尝试的代码:-

base = MySQLdb.connect (host="localhost", user = "root", passwd = "sheeshmohsin", db="points")
basecursor = base.cursor()
queryone = """INSERT INTO nearest_product_type (name,created,modified) VALUES (%s,%s,%s) ON DUPLICATE KEY UPDATE name=name """
category = "Indica"
valueone = (category,datetime.datetime.now(),datetime.datetime.now())
basecursor.execute(queryone, valueone)
product_id = basecursor.lastrowid
basecursor.close()
base.commit()
base.close()
print product_id

在运行这个 python 脚本时,第一次当类别不是唯一的时,它工作正常,但是在与第一次相同的类别再次运行时,最后一行 id 返回 0。但我需要最后一行的 id更新了。

当我检查表中的行时,自动增量也在起作用,假设如果我运行脚本四次,第一次当类别唯一时,id 为 1,假设第四次出现另一个唯一类别,那么分配给这一行的 id 是 4,但它应该是 2,因为它的第二行。我该如何解决这个问题?

【问题讨论】:

  • 阅读this 问题,我想这可能会有所帮助。

标签: python mysql sql mysql-python


【解决方案1】:

您访问数据库的方式有问题。当您尝试在数据库中插入一个具有已存在的名称的新行时,由于列名被声明为唯一,插入将失败。

如果要修改现有行,则必须使用 UPDATE 语句而不是 INSERT 语句。而且在 SQL 中没有任何东西可以进行插入或更新。

自动增量中没有任何东西可以保证 id 是连续的。您所知道的是,数据库将允许每个插入的行使用不同的 id,但插入失败可能(并且在您的情况下)结果是孔是 id 序列。

此外,一些驱动程序可能允许预先保留 id,特别是网络连接以允许客户端连接获取一堆 id,以防它插入多行。在这种情况下,如果另一个客户端请求 id,并且两个客户端交替插入行,则 id 不会跟随插入时间。

【讨论】:

    【解决方案2】:

    这里的 ON DUPLICATE KEY UPDATE 部分将不起作用,因为键是自动增量列,它永远不会重复。

    几乎可以肯定是这个子句导致了意外的计数,特别是考虑到 name 的 UNIQUE 设置。

    您可以尝试使用 SELECT MAX(id) FROM nearest_product_type 之类的方法来获取添加的最后一个 id。

    【讨论】:

      猜你喜欢
      • 2014-05-09
      • 2010-11-26
      • 2013-12-09
      • 1970-01-01
      • 2011-04-02
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      相关资源
      最近更新 更多