我是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,因为它的第二行。我怎么能解决这个问题?
答案 0 :(得分:2)
这里的ON DUPLICATE KEY UPDATE部分不起作用,因为键是自动增量列,它永远不会重复。
几乎可以肯定这个子句会导致意外的计数,特别是在名称上设置了UNIQUE时。
您可以尝试使用SELECT MAX(id)FROM nearest_product_type之类的内容来获取最后一个ID。
答案 1 :(得分:0)
访问数据库的方式有问题。当您尝试使用已存在的名称 插入数据库中的新行时,由于列名称被声明为唯一,插入将失败。
如果要修改现有行,则必须使用UPDATE
语句而不是INSERT
语句。在SQL中没有任何内容可以执行插入或更新。
自动增量中没有任何内容可以保证id是连续的。所有你知道的是,数据库将为每个插入的行允许不同的id,但插入失败可以(并且在你的情况下)结果是hole是id序列。
此外,某些驱动程序可能允许预先保留 ID,特别是网络连接允许客户端连接获取一堆ID,以防它插入多行。在这种情况下,如果另一个客户端请求id,并且两个客户端交替插入行,则id将不会跟随插入时间。