Почему при обновлении появляется сообщение «ОШИБКА 1062 (23000): повторяющаяся запись« 4289 »для ключа 1»? - PullRequest
2 голосов
/ 18 августа 2011

Этот вопрос задавался в нескольких различных вариантах ранее, но ответы, предоставленные в этих случаях, поэтому не приблизились, чтобы помочь мне решить мою проблему.

Мы работаем с версией MySQL "5.0.41-community-log MySQL Community Edition (GPL) "Рассматриваемая таблица описывается примерно так (большую часть определения таблицы я удалил по деловым причинам):

 Field      Type          Null     Key     Default     Extra          
 ---------  ------------  -------  ------  ----------  -------------- 
 id         bigint(20)    NO       PRI     (null)      auto_increment 
 ...
 extracted  tinyint(1)    YES              (null)                     

Когда я запускаю оператор SQL update:

UPDATE transaction_tbl SET extracted = 1 WHERE id = 4289

Я получаю сообщение об ошибке:

ERROR 1062 (23000): Duplicate entry '4289' for key 1

при выполнении этого оператора select:

SELECT id, extracted FROM transaction_tbl WHERE id BETWEEN 4288 AND 4290

производит это:

 id     extracted   
 -----  ------------ 
 4288   0                
 4289   0                
 4290   0                

У меня естьчитал местами об использовании REPAIR на столе, но получил ответ, что «Механизм хранения для таблицы не поддерживает восстановление»

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

Ответы [ 2 ]

1 голос
/ 19 декабря 2012

Как упоминали @rabudde и @Eljakim в разделе комментариев этого вопроса, в моем случае эта проблема была вызвана действиями триггера.

Триггер пытался вставить записьв другую таблицу, и эта вставка не удалась из-за проблемы с дублированием ключа.

используйте SHOW TRIGGERS LIKE 'transaction_tbl' (в моем случае), чтобы найти все триггеры, действующие на столе, и оттуда это немного трудоемко для обнаружениякакой триггер плохой.

В конечном итоге мне пришлось изменить триггер, чтобы выполнить вставку только в том случае, если записи нет в целевой таблице, и выполнить обновление, если она там была.

0 голосов
/ 18 августа 2011

Если в этой таблице есть Innodb, вы не можете использовать ремонт (только для MyIsam). Для восстановления таблицы InnoDb вы должны запустить

Alter table transaction_tbl Engine=Innodb;

или перезагрузите сервер.

Для проверки статуса таблицы попробуйте использовать:

SHOW TABLE STATUS LIKE 'transaction_tbl'
...