序言:这个问题可能对使用MySQL时收到wrong
错误消息的人有用。提供错误消息错误的证明。
在MySQL数据库(版本5.7.18(中,MyISAM表"sensorhistory"有一个类型为"int(11("的列"id",带有额外的"auto_increment"。数据是从用 C# 编写的应用程序插入的。当然,INSERT
查询不会直接写入id
列。这就是"auto_increment"的用途。该表还包含另外 30 个浮点型和 varchar 类型的字段,以及一个DateTime(3)
。参数化查询很长。
我收到以下错误消息:
Duplicate entry '284093' for key 'PRIMARY'
at MySql.Data.MySqlClient.MySqlStream.ReadPacket()
at MySql.Data.MySqlClient.NativeDriver.GetResult(Int32& affectedRow, Int64& insertedId)
at MySql.Data.MySqlClient.Driver.NextResult(Int32 statementId, Boolean force)
at MySql.Data.MySqlClient.MySqlDataReader.NextResult()
at MySql.Data.MySqlClient.MySqlCommand.ExecuteReader(CommandBehavior behavior)
at MySql.Data.MySqlClient.MySqlCommand.ExecuteNonQuery()
at DataStorage.SensorHistoryDatastore.StoreSensorHistory(IReadOnlyList'1 _reports, Boolean _canRetry) in C:Usersbernhard.hillerSVNProduct-SWtrunkC_DataStoragePhysicalContainersSensorHistoryDatastore.cs:line 84
奇怪的是,当我在MySQL工作台中执行SELECT max(id) FROM sensorhistory
时,我得到的最大值为284092
,即比"重复条目"少1。这证明错误消息是错误的。
我想知道这种奇怪的错误是如何发生的,以及如何解决它。
补遗:
MySQL Workbench中的"分析表"显示该表已损坏:Found key at page 6585344 that points to record outside datafile
它可以通过简单的Repair table sensorhistory
进行修复 我仍然对表格的损坏是如何发生的感兴趣。
顺便说一句:非常感谢所有那些似乎无法阅读文本的 DOWNVOTERS:这不是一个关于"重复键"的愚蠢问题,因为我展示了重复值根本不存在的证据!
附录208-09-12:
该错误在仅 1 天、相同的表、相同的错误消息(只是具有新值(后再次发生。
Windows 事件日志显示 9 月 7 日至 9 月 11 日期间发生了 7 次以上的崩溃(ID 6008:"以前的系统关闭是意外的"(。表传感器历史记录中的最新条目是在这两种情况下发生此类崩溃之前不久。
坠机事件于9月11日上午结束。我不知道原因 - 其他人也在研究那台测试机。那时没有更多的数据库问题。
我的结论是,突然的Windows崩溃导致数据库中的一些不一致,然后导致该错误消息。