mysql копируют ошибку записи, когда нет никакой дублирующейся записи (объемная загрузка через php)

В Excel единицами являются дни, поэтому, если вы хотите рассчитать количество минут между двумя временными метками, вам нужно вычесть обе и умножить разницу на 24*60 (это количество минут за один день). [116 ]

например. Вы начинаете работать в 09:07 (ячейка B2) и заканчиваете в 18:07 (ячейка B3), имея 45-минутный перерыв. Тогда время, которое вы проработали в минутах:

=(B3-B2)*24*60-45

Убедитесь, что форматирование ячейки правильное (общее), вы получите: 495.

6
задан Rohit Gupta 26 August 2015 в 00:04
поделиться

6 ответов

Ошибки как это могут произойти, когда таблица MyISAM становится поврежденной. Выполнение команды восстановления на рассматриваемой таблице обычно является всем, что это требуется, чтобы фиксировать его:

> repair table mytablename;

Лучшее решение не состоит в том, чтобы использовать MyISAM для таблиц, где данные постоянно изменяются - InnoDB является намного более пуленепробиваемым, и как Paul правильно указывает, можно использовать транзакции на таблицах InnoDB, но не на MyISAM.

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

> truncate table temptable;
> truncate table importtable;

> #bulk insert new data
> insert into importtable(col1,col2,col3) 
> values(1,2,3),(4,5,6),(7,8,9);

> #now archive the live data
> insert into temptable(col1,col2,col3)
> select col1,col2,col3 from livetable;

> #finally copy the new data to live
> truncate table livetable;
> insert into livetable(col1,col2,col3)
> select col1,col2,col3 from importtable;

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

2
ответ дан 17 December 2019 в 18:21
поделиться

Некоторый другой сценарий мог вставлять в базу данных, в то время как Ваш сценарий импорта работает?

0
ответ дан 17 December 2019 в 18:21
поделиться

Вы попытались позволить журналу запросов видеть, вставляете ли Вы действительно дубликат?

Можно ли воспроизвести его в тестовой среде? Не включайте журнал запросов в производстве.

Возможно, что таблица была повреждена, если проблема подлинная; это могло быть вызвано многими вещами, но изворотливые аппаратные средства или сбой питания являются возможностями.

Проверьте журнал mysql, чтобы видеть, имел ли он какие-либо проблемы (или отказал), недавно или в течение периода.

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

0
ответ дан 17 December 2019 в 18:21
поделиться

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

теперь я использовал DELETE FROM вместо TRUNCATE и измененный RENAME TABLE операторы (то, где я сделал 3, переименовывает сразу каждого) к набору сингла ALTER TABLE xxx RENAME TO zzz операторы и не могут больше воспроизводить ошибку.

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

1
ответ дан 17 December 2019 в 18:21
поделиться

Вы используете транзакции? Можно устранить много этих видов проблем с транзакциями, особенно если возможно или заблокировать таблицы или установить режим изоляции транзакции на сериализуемый. Я не действительно знаком с теми, которые на MySQL, но я полагаю, что транзакции только работают над таблицами InnoDB (или это могло быть устаревшим знанием).

0
ответ дан 17 December 2019 в 18:21
поделиться

Вы создаете новую запись с опущенным полем 'id' (или NULL), НО ранее вы обновили другую запись и изменили ее идентификатор на 911. Другими словами, вы не можете создать другую запись, если используется значение AUTO_INCREMENT вашей таблицы.

0
ответ дан 17 December 2019 в 18:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: