更新

时间:2018-01-03 04:56:47

标签: mysql

我有一个mySQL表,它是这样创建的:

CREATE TABLE `LastSeen` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `ClassName` enum('LastSeen') CHARACTER SET utf8 DEFAULT 'LastSeen',
  `LastEdited` datetime DEFAULT NULL,
  `Created` datetime DEFAULT NULL,
  `LastSeenDate` datetime DEFAULT NULL,
  `DeviceID` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`ID`),
  UNIQUE KEY `DeviceID` (`DeviceID`),
  KEY `ClassName` (`ClassName`)
) ENGINE=InnoDB AUTO_INCREMENT=2470 DEFAULT CHARSET=latin1;

我有一个INSERT ON DUPLICATE KEY UPDATE声明:

INSERT INTO `LastSeen` (LastSeenDate, DeviceID) VALUES (#{DateTime}, #{DeviceID})
   ON DUPLICATE KEY UPDATE LastSeenDate = VALUES(LastSeenDate), DeviceID = VALUES(DeviceID)

如果唯一键不存在,则会创建新记录。当唯一键存在时,记录将更新。但是,更新记录时,自动递增ID会递增。因此,如果最后一条记录具有ID 2000,则执行两次更新,然后发生插入,新记录将具有2003而不是2001的ID。

如何防止这种情况发生?由于更新的频率,表格将过早地耗尽ID。

在提出这个问题之前,我试图遵循:How can I disable an auto-incrementing ID from updating on duplicate key update?,但密钥仍在更新。我也试图在各个网站上找到答案,但找不到满意的答案。

2 个答案:

答案 0 :(得分:0)

INSERT ... ON DUPLICATE KEY UPDATEREPLACAE ...都存在此问题:gap of auto_increament value,使用bigint是更好的方式;

gap of auto_increament value在MySQL中的两个查询中无法避免;

要避免此问题,请使用UUIDUNIQUE KEY,因为PK可能有所帮助。

答案 1 :(得分:-1)

在您的表中,您还有一个密钥可以使系统插入而不是更新。 DeviceID是唯一的,因此当您有两个相同的ID时,它将插入一个新记录。我在那里看不到任何问题。

我希望这会有所帮助。