Неверное сообщение об ошибке: “дубликат записи '284093' для ключа 'PRIMARY'”
В базе данных MySQL (версия 5.7.18),
MyISAM
стол sensorhistory
имеет колонку id
типа int(11)
с доплатой auto_increment
. Данные вставляются из приложения, написанного на языке C#. То
INSERT
конечно, запрос не записывает столбец id напрямую. Вот для чего нужен "auto_increment". Таблица содержит еще 30 полей: float
и varchar
типы, соотв., плюс а DateTime(3)
Параметризованный запрос длинен, поэтому я опущу его здесь.В настоящее время 4 машины пишут строку в таблицу каждые ~30 секунд.
Я получаю следующее сообщение об ошибке:
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
Что я уже пробовал:
Как ни странно, когда я выполняю
SELECT max(id) FROM sensorhistory
в MySQL Workbench
, Я получаю максимальное значение 284092
, то есть на 1 меньше, чем "дубликат записи" из 284093. Это доказательство того, что сообщение об ошибке неверно.Один
Analyze table
в MySQL Workbench показали, что таблица повреждена: Found key at page 6585344 that points to record outside datafile
Его можно было починить с помощью простого
Repair table sensorhistory
Ошибка повторилась всего через 1 день, та же таблица, то же сообщение об ошибке (только с новым значением).
Меня интересует, как могло произойти это искажение таблицы и как предотвратить его повторение.