SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.09.2012 01:40:20

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

REPLACE строк в случае если вставляемое значение больше заменяемого

Есть запрос:

REPLACE INTO table1 (*) SELECT * FROM table2 WHERE `id`<'1000';

Нужно переписать запрос так, чтобы REPLACE происходил только когда значение поля a копируемой строки таблицы больше поля a заменяемой строки: table2.a > table1.a. Подскажите как сделать

Неактивен

 

#2 08.09.2012 05:21:22

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: REPLACE строк в случае если вставляемое значение больше заменяемого

Если индекс уникальный:

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);

Условие t1.id IS NULL на случай, если в t1 нет строки с данным id (я так понял в этом случае вставлять нужно).

Неактивен

 

#3 08.09.2012 16:40:58

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: REPLACE строк в случае если вставляемое значение больше заменяемого

Спасибо, только 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

Неактивен

 

#4 08.09.2012 17:07:18

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: REPLACE строк в случае если вставляемое значение больше заменяемого

(*) это из вашего поста скопировалось.

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);

Неактивен

 

#5 08.09.2012 18:49:58

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: REPLACE строк в случае если вставляемое значение больше заменяемого

Большое спасибо

Неактивен

 

#6 08.09.2012 19:49:06

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: REPLACE строк в случае если вставляемое значение больше заменяемого

Запустил и оказалось что каждый ~ десятый запрос 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)

Неактивен

 

#7 08.09.2012 20:11:01

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3878

Re: REPLACE строк в случае если вставляемое значение больше заменяемого

Deadlock можно обойти через временную таблицу:

DROP TEMPORARY TABLE IF EXISTS x;
CREATE TEMPORARY TABLE x 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);
REPLACE INTO table1 SELECT * FROM x;
 


На форуме vasya предлагал решение, как это сделать одним запросом. Нужно добавить подзапрос в части FROM, который фактически будет выполняться через временную таблицу. Попробуйте такое:

REPLACE INTO table1 SELECT * FROM (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)) t;

Неактивен

 

#8 09.09.2012 22:57:01

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: REPLACE строк в случае если вставляемое значение больше заменяемого

Спасибо, воспользовался вторым вариантом и деадлоки пока не возникали

Неактивен

 

#9 14.09.2012 01:24:10

gif-t
Завсегдатай
Зарегистрирован: 08.08.2011
Сообщений: 74

Re: REPLACE строк в случае если вставляемое значение больше заменяемого

В боевых условиях второй вариант не уберег от деадлоков

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson