SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 21.01.2015 13:57:55

Osi322
Участник
Зарегистрирован: 04.07.2014
Сообщений: 24

UPDATE таблицы с уникальными ключами

Столкнулся с проблемой.. таблица:id,a,b,c,val.
a,b,c- это уникальный ключ
val - числовое значение
таблица x имеет следующие значения
id__a__b__c__val
1    5   5   1    2
2    5   6   1    2
3    5   6   2    2
4    6   7   2    2
_______________
Вопрос: как можно обновить таблицу при условии, если: (a=5 and b=5) or (a=5 and b=6). то меняем у этих строк значение b=9, а val при одинаковых 'c' складывался.
То есть в итоге ответ будет:
id__a__b__c__val
1    5   9   1    4
-    -    -   -     -
3    5   9   2    2
4    6   7   2    2

Запрос Insert .. on dublicate key.. работает на вставку новых строк, а мне нужно обновить таблицу по условию, типа запроса:
Update x set b=9 WHERE a=5 and ( b='5' or b='6')
Что можете посоветовать?

Неактивен

 

#2 21.01.2015 16:25:24

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

Re: UPDATE таблицы с уникальными ключами

Как я понимаю, нужно два действия
1)

Update x set b=9 WHERE a=5 and ( b='5' or b='6')

2) сложить val у строк, у которых совпадают a,b,c. То есть две строки:
1    5   9   1    2
2    5   9   1    2
заменить на одну:
?    5   9   1    4

Но первое действие нарушает условие уникального ключа? В этом случае проще всего сделать через временную таблицу
CREATE TEMPORARY TABLE t SELECT a,9 AS b,c,SUM(val) AS VAR FROM x WHERE a=5 AND ( b='5' OR b='6') GROUP BY a,c;

затем удаляем эти строки их x и вставляем снова
DELETE FROM x WHERE a=5 AND ( b='5' OR b='6');
INSERT INTO x SELECT NULL, a,b,c,val FROM t;
DROP TEMPORARY TABLE t;

все делать внутри транзакции

Неактивен

 

#3 22.01.2015 06:58:09

Osi322
Участник
Зарегистрирован: 04.07.2014
Сообщений: 24

Re: UPDATE таблицы с уникальными ключами

Спасибо, за совет! Опечатка?

DROP TEMPORARY TABLE t;

Неактивен

 

#4 22.01.2015 08:06:35

Osi322
Участник
Зарегистрирован: 04.07.2014
Сообщений: 24

Re: UPDATE таблицы с уникальными ключами

И еще вопрос, не понял как работает запрос

SELECT ... FOR UPDATE

то есть когда мы добавляем в конец селекта for update, то мы блокируем выбранные строки. и можем их менять, удалять.. пока не обновим выбранные строки простым update?

Неактивен

 

#5 22.01.2015 09:43:07

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

Re: UPDATE таблицы с уникальными ключами

Спасибо, действительно опечатка. Этот пример показывает почему нужно использовать DROP TEMPORARY TABLE, а не универсальную DROP TABLE.

SELECT .. FOR UPDATE блокирует выбранные  строки до конца текущей транзакции.

Неактивен

 

Board footer

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