Как исправить запрос MySql?

Здравствуйте, уважаемые форумчане.
Есть у меня php файл, который запускается кроном раз в сутки и в нем выполняется запрос, который копирует комментарии старше двух суток из чата в архив . Структура обеих таблиц полностью идентична. И что странно, иногда мне от крона приходит ошибка на почту
PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1078458' for key 'PRIMARY'' in /var/www/user/data/www/site.ru/cron/chat.php:10
Stack trace:
#0 /var/www/user/data/www/site.ru/cron/chat.php(10): PDO->query('INSERT INTO `ur...')
#1 {main}
thrown in /var/www/user/data/www/site.ru/cron/chat.php on line 10

Сам запрос такой:
$sql->query("INSERT INTO `chatArhive` SELECT * FROM `comments` where news_id = '77278' and dateAdd < (NOW() - INTERVAL 2 DAY)");

Так вот, почему вообще такое может возникать и как с этим бороться?
Какой-то закономерности не наблюдается. Может месяц нормально копироваться, а потом ошибка, а может несколько раз за несколько недель ошибку выдать.
Что это за ошибка я знаю, но вот почему она появляется, не пойму, ведь все должно копироваться из одной таблицы в другую и дубликатов по идее быть не может.
  • Вопрос задан
  • 1101 просмотр
Пригласить эксперта
Ответы на вопрос 4
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
и дубликатов по идее быть не может
Почему не может? Вы раз в сутки копируете сообщения за двое суток. Дубли просто обязаны появиться.
Ответ написан
mad_maximus
@mad_maximus
Так не копируйте айдишники, зачем? Айдишники первой таблицы пусть сами генерируются. Вставляйте только нужные поля.
Ответ написан
samodum
@samodum
Какой вопрос - такой и ответ
Заблуждения программистов о времени
https://habr.com/ru/post/146109/
Ответ написан
Комментировать
AlekseyNikulin
@AlekseyNikulin
недочеловек
Александр, решается довольно просто:

INSERT INTO table1 (column1, column2, column3, ...)
   SELECT t2.column1,  t2.column2, t2.column3, ...
   FROM table2 t2
   WHERE condition
ON DUPLICATE KEY UPDATE
   column2 = VALUES(column2),
   column3 = VALUES(column3),
   ...
;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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