Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Есть запрос:
Неактивен
Если индекс уникальный:
Неактивен
Спасибо, только mysql пишет про ошибку:
[SQL] REPLACE INTO table1 (*) SELECT t2.* FROM table2 t2 LEFT JOIN table1 t1 USING(id) WHERE t2.id<'1000' AND (t2.field>t1.field OR t1.id IS NULL);
[Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) SELECT t2.* FROM table2 t2 LEFT JOIN table1 t1 USING(id) WHERE t2.id<'1000' A' at line 1
Если убрать REPLACE, запрос отрабатывает нормально:
[SQL] SELECT t2.* FROM table2 t2 LEFT JOIN table1 t1 USING(id) WHERE t2.id<'1000' AND (t2.field>t1.field OR t1.id IS NULL);
[Err] 1146 - Table 'hublist.table2' doesn't exist
Неактивен
(*) это из вашего поста скопировалось.
Неактивен
Большое спасибо
Неактивен
Запустил и оказалось что каждый ~ десятый запрос REPLACE не проходит из-за возникающего
Deadlock found when trying to get lock;
Перед REPLACE у меня выполняется INSERT IGNORE, вставляющий строки с недостающими индексами, поэтому заменяемые строки на момент REPLACE уже присуствуют в table1 и он разделяется на DELETE и INSERT, что, как я понял, и приводит к деадлоку. Можно ли переписать этот запрос на UPDATE или INSERT ON DUPLICATE KEY UPDATE?
Отредактированно gif-t (08.09.2012 19:49:40)
Неактивен
Deadlock можно обойти через временную таблицу:
Неактивен
Спасибо, воспользовался вторым вариантом и деадлоки пока не возникали
Неактивен
В боевых условиях второй вариант не уберег от деадлоков
Неактивен
Страниц: 1