Я только что видел эту ошибку в одном из наших приложений Rails, использующих MySQL. У нас была эта строка в базе данных:
mysql> select * from user_notes where id='32012';
+-------+---------+------------+--------------------+---------------------+---------------------+
| id | user_id | admin_user | comment | created_at | updated_at |
+-------+---------+------------+--------------------+---------------------+---------------------+
| 32012 | 1517776 | foo | ID: DIl4Zy7mgo9fQ0 | 2018-07-26 13:30:33 | 2018-07-26 13:30:33 |
+-------+---------+------------+--------------------+---------------------+---------------------+
Затем мы получили эту ошибку:
Mysql2::Error: Duplicate entry '32012' for key 'PRIMARY':
INSERT INTO 'user_notes' ('admin_user', 'comment', 'user_id', 'created_at',
'updated_at') VALUES
('foo', 'ID: DIlKKFX2jLxh3p', 1517788, '2018-07-26 13:46:51', '2018-07-26 13:46:51')
Таким образом, выгода заключается в том, что в базу данных была добавлена новая запись, и по какой-то странной причине использовался тот же первичный ключ, что и для записи, вставленной ~ 16 минут раньше.
Запись с 32013
(следующая) была вставлена в 2018-07-26 13:54:24
, так что это нормально.
Я бы предположил, что внутренний инкремент первичного ключа не выполнил свою работу после вставки записи 32012
, но как это возможно? Любые советы оценены! Важно отметить, что это было изолированное событие.
FYI: user_notes
выглядит следующим образом:
CREATE TABLE 'user_notes' (
'id' int(11) NOT NULL AUTO_INCREMENT,
'user_id' int(11) DEFAULT NULL,
'admin_user' varchar(255) DEFAULT NULL,
'comment' text NOT NULL,
'created_at' datetime DEFAULT NULL,
'updated_at' datetime DEFAULT NULL,
PRIMARY KEY ('id'),
KEY 'index_user_notes_on_user_id' ('user_id'),
KEY 'index_user_notes_on_admin_user' ('admin_user')
) ENGINE=InnoDB AUTO_INCREMENT=33082 DEFAULT CHARSET=utf8
Похоже, что за это время мы выполняли некоторые обновления, связанные с базой данных, и из-за этого произошла ошибка, более чем уверенная. Мы не смогли точно определить причину ошибки.
32012
в качестве значенияid
? Это было бы мое первое предположение; вставка только что вызвала сбой MySQL снова.32012
в качествеid
. Это первичный ключ на столе, поэтому мы не могли просто добавить туда дубликат. Оператор вставки также генерируется тем же сценарием, который заполнил всю таблицу, поэтому в этом нет ничего плохого.