Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Отнять из одного поля и прибавить к другому. Одним запросом. / 8 сообщений из 8, страница 1 из 1
30.09.2014, 21:05:10
    #38762624
FFA
FFA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отнять из одного поля и прибавить к другому. Одним запросом.
Всем привет.

Нужен запрос для перевода суммы со счета на счет.

Есть конечно простой метод:

Код: sql
1.
2.
3.
4.
SELECT balance FROM account WHERE accid='1';
 ... проверка (balance>=100) ... 
UPDATE account SET balance=balance-100 WHERE accid='1';
UPDATE account SET balance=balance+100 WHERE accid='2';



Но тут целых 3 запроса. Пока они выполняются, balance может измениться, это не безопасно.
Я использую очень урезанный коннектор, который выполняет каждый запрос отдельно.

accid - int, уникальный, не key

Пожалуйста помогите составить запрос.
...
Рейтинг: 0 / 0
30.09.2014, 21:23:53
    #38762637
Lumix
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отнять из одного поля и прибавить к другому. Одним запросом.
FFA Пока они выполняются, balance может измениться, это не безопасно.

для этих случаев собственно и придумали транзакции

FFA Я использую очень урезанный коннектор, который выполняет каждый запрос отдельно.

тогда мутите локи вручную...

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

так вот все эти транзакции складывались в очередь асинхронно, то есть в случайном порядке
а выполнялись уже отдельным воркером один за другим
таким образом мы обеспечили работу системы, но при этом на уровне технического задания мы сначала выторговали, что каждая примененная к балансам операция не обязана быть мгновенной
...
Рейтинг: 0 / 0
30.09.2014, 22:10:41
    #38762651
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отнять из одного поля и прибавить к другому. Одним запросом.
FFA, или всё запихать в хранимку - один запрос, и транзакции проще, и на всё выполнение меньше времени
...
Рейтинг: 0 / 0
30.09.2014, 22:42:51
    #38762675
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отнять из одного поля и прибавить к другому. Одним запросом.
FFAВсем привет.

Нужен запрос для перевода суммы со счета на счет.

Есть конечно простой метод:

Код: sql
1.
2.
3.
4.
SELECT balance FROM account WHERE accid='1';
 ... проверка (balance>=100) ... 
UPDATE account SET balance=balance-100 WHERE accid='1';
UPDATE account SET balance=balance+100 WHERE accid='2';



Но тут целых 3 запроса. Пока они выполняются, balance может измениться, это не безопасно.
Я использую очень урезанный коннектор, который выполняет каждый запрос отдельно.

accid - int, уникальный, не key

Пожалуйста помогите составить запрос.

попробуйте:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
UPDATE account a1
set a1.balance = a1.balance + 100 * if(a1.accid=2,1,-1)
where a1.accid in (1,2) 
and exists (
  select 1 
  from account a2 
  where a2.accid=1 
  and a2.balance >= 100 ) 
...
Рейтинг: 0 / 0
30.09.2014, 22:43:24
    #38762676
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отнять из одного поля и прибавить к другому. Одним запросом.
FFA
Код: sql
1.
2.
3.
4.
SELECT balance FROM account WHERE accid='1';
 ... проверка (balance>=100) ... 
UPDATE account SET balance=balance-100 WHERE accid='1';
UPDATE account SET balance=balance+100 WHERE accid='2';


Код: sql
1.
2.
3.
4.
5.
6.
7.
UPDATE account ac, (SELECT a.balance FROM account a WHERE a.accid='1') test
SET ac.balance=ac.balance + CASE ac.accid 
                            WHEN 1 THEN -100 
                            WHEN 2 THEN 100 
                            END 
WHERE test.balance >= 100
  AND ac.accid IN (1,2);
...
Рейтинг: 0 / 0
30.09.2014, 23:00:28
    #38762683
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отнять из одного поля и прибавить к другому. Одним запросом.
или даже пороще

Код: sql
1.
2.
3.
4.
5.
6.
7.
UPDATE account a1,
(select 1 
  from account a2 
  where a2.accid=1 
  and a2.balance >= 100 )
set a1.balance = a1.balance + 100 * if(a1.accid=2,1,-1)
where a1.accid in (1,2) 
...
Рейтинг: 0 / 0
01.10.2014, 02:37:02
    #38762778
FFA
FFA
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отнять из одного поля и прибавить к другому. Одним запросом.
Ребят, спасибо за помощь.

Способ от javajdbc не могу до конца понять, т.к. не понимаю эту конструкцию:
Код: sql
1.
2.
3.
4.
(select 1 
  from account a2 
  where a2.accid=1 
  and a2.balance >= 100 )



Юзаю код Akina.

Пишу ф-ю, пытаюсь впихнуть
Код: sql
1.
INTO ret


, где ret - переменная функции, которая возвращается RETURN'ом, но что-то не получается пока.
...
Рейтинг: 0 / 0
01.10.2014, 02:52:57
    #38762783
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Отнять из одного поля и прибавить к другому. Одним запросом.
FFAРебят, спасибо за помощь.

Способ от javajdbc не могу до конца понять, т.к. не понимаю эту конструкцию:
Код: sql
1.
2.
3.
4.
(select 1 
  from account a2 
  where a2.accid=1 
  and a2.balance >= 100 )



Юзаю код Akina.

Пишу ф-ю, пытаюсь впихнуть
Код: sql
1.
INTO ret


, где ret - переменная функции, которая возвращается RETURN'ом, но что-то не получается пока.

По идее мой код идентичен от коду Акина (и моему сомому первому,
правда кажется подселект EXISTS в апдейте не разрешен).

(select 1
from account a2
where a2.accid=1
and a2.balance >= 100 )

выдаст пустое множество если на балансе акоунт1
будет меньше чем 100. Этот селект "помножен"
(картезиан джойн) на
основной апдейт. Т.е апдейт пройдет если
данный селект вернет один рекорд и апдейта
не будет если селект вернет пустое множество.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Отнять из одного поля и прибавить к другому. Одним запросом. / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]