序言:这个问题对使用MySQL时收到wrong
错误消息的人可能有用。证明错误消息是错误的。
在MySQL数据库(版本5.7.18)中,MyISAM表“ sensorhistory”具有类型为“ int(11)”的列“ id”,带有额外的“ auto_increment”。数据是用C#编写的应用程序插入的。当然,INSERT
查询不会直接写入id
列。这就是“ auto_increment”的用途。该表还包含30个float和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:\Users\bernhard.hiller\SVN\Product-SW\trunk\C_DataStorage\PhysicalContainers\SensorHistoryDatastore.cs:line 84
奇怪的是,当我在MySQL Workbench中执行SELECT max(id) FROM sensorhistory
时,得到的最大值为284092
,即比“重复项”小1。这证明错误消息是错误的。
我想知道这种奇怪的错误如何发生以及如何解决。
附录:
MySQL Workbench中的“分析表”显示该表已损坏:
Found key at page 6585344 that points to record outside datafile
可以使用简单的Repair table sensorhistory
进行修复
我仍然对表的损坏如何发生感兴趣。
顺便说一句:非常感谢所有似乎无法阅读文字的下载者:这并不是关于“重复键”的愚蠢问题,因为我展示了证明重复值的证据根本不存在!
附录208-09-12:
仅在1天,同一张表,同一条错误消息(只是带有新值)之后,错误再次发生。
答案 0 :(得分:0)
Windows事件日志显示9月7日至9月11日之间发生了7次以上的崩溃(ID 6008:“先前的系统关闭是意外的”)。在这两种情况下,表传感器历史记录中的最新条目均在此类崩溃之前不久。
当机事故于9月11日上午结束。我不知道原因-其他人也在该测试机上工作。那时没有其他数据库问题了。
我得出结论,Windows突然崩溃导致数据库中出现一些不一致,然后导致该错误消息。