[英]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 UPDATE
和REPLACAE ...
都有这个问题: gap of auto_increament value
,使用bigint
是更好的方法。
gap of auto_increament value
无法避免在MySQL中的两次查询中;
为避免此问题,请使用UUID
或UNIQUE KEY
因为PK可能会有所帮助。
在表中,您还有一个键,使系统可以插入而不是更新。 DeviceID是唯一的,因此当您有两个相同的ID时,它将插入一条新记录。 我在那里没有看到任何问题。
我希望这将有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.