我有一个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?,但密钥仍在更新。我也试图在各个网站上找到答案,但找不到满意的答案。
答案 0 :(得分:0)
INSERT ... ON DUPLICATE KEY UPDATE
和REPLACAE ...
都存在此问题:gap of auto_increament value
,使用bigint
是更好的方式;
gap of auto_increament value
在MySQL中的两个查询中无法避免;
要避免此问题,请使用UUID
或UNIQUE KEY
,因为PK可能有所帮助。
答案 1 :(得分:-1)
在您的表中,您还有一个密钥可以使系统插入而不是更新。 DeviceID是唯一的,因此当您有两个相同的ID时,它将插入一个新记录。我在那里看不到任何问题。
我希望这会有所帮助。