Mysql2 :: Ошибка: Дублирующая запись '32012' для ключа 'PRIMARY'

0

Я только что видел эту ошибку в одном из наших приложений 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
  • 0
    Насколько я знаю, этот оператор вставки не мог сгенерировать сообщение об ошибке, которое вы видите. Есть ли вероятность, что у кого-то уже есть две записи с 32012 в качестве значения id ? Это было бы мое первое предположение; вставка только что вызвала сбой MySQL снова.
  • 0
    Нет, это просто один с 32012 в качестве id . Это первичный ключ на столе, поэтому мы не могли просто добавить туда дубликат. Оператор вставки также генерируется тем же сценарием, который заполнил всю таблицу, поэтому в этом нет ничего плохого.
Показать ещё 2 комментария
Теги:
primary-key

1 ответ

0
Лучший ответ

Похоже, что за это время мы выполняли некоторые обновления, связанные с базой данных, и из-за этого произошла ошибка, более чем уверенная. Мы не смогли точно определить причину ошибки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню