我有一个这样创建的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将过早耗尽。
在问这个问题之前,我尝试这样做:How can I disable an auto-incrementing ID from updating on duplicate key update?,但密钥仍然会更新。我也试图在不同的网站上寻找答案,但没有找到令人满意的答案。
发布于 2018-01-03 13:11:10
INSERT ... ON DUPLICATE KEY UPDATE和REPLACAE ...都有这样的问题:gap of auto_increament value,使用bigint是更好的方式;
MySQL中的两个查询中gap of auto_increament value无法避免;
为了避免这个问题,使用UUID或UNIQUE KEY as PK可能会有所帮助。
发布于 2018-01-03 13:02:39
在您的表中,您还有一个键将使系统插入而不是更新。DeviceID是唯一的,所以当您有两个相同的it时,它将插入一条新记录。我看不出有什么问题。
我希望这能有所帮助。
https://stackoverflow.com/questions/48071403
复制相似问题