繁体   English   中英

InnoDB表在更新时自动递增ID值

[英]InnoDB Table auto incrementing ID value on update

我有一个像这样创建的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,则执行两次更新然后插入,新记录的ID为2003,而不是2001。

如何防止这种情况发生? 由于更新频率高,该表将过早用完ID。

在问这个问题之前,我尝试过遵循以下步骤: 如何在重复密钥更新时禁止自动递增ID更新? 但密钥仍会更新。 我也尝试在各种站点上找到答案,但找不到满意的答案。

INSERT ... ON DUPLICATE KEY UPDATEREPLACAE ...都有这个问题: gap of auto_increament value ,使用bigint是更好的方法。

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

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

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

我希望这将有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM