trigger, join, insert->select

Hett
Дата: 27.12.2012 14:53:51
Есть таблица balance_history, в которой есть триггер на все события, который обновляет данные в таблице User (просто делает апдейт 1 поля)

            INSERT INTO fh_balance_history
            SELECT date(date)
                 , SUM(bh.charge) / 100 * 5
             FROM fh_balance_history bh
              LEFT JOIN fh_user u ON bh.user_id = u.id
            WHERE
               ....
            GROUP BY
              u.id,
              date(date)
            ORDER BY bh.id DESC


Сейчас наткнулся на такую ошибку:

автор
Can't update table 'fh_user' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.


Мне не очень понятно, что ему не понравилось, таблицу user в запросе я изменяю.
trew
Дата: 27.12.2012 15:12:55
Hett,

Если это код триггера, где в нем таблицы NEW и/или OLD ?
trew
Дата: 27.12.2012 15:20:41
Hett
Дата: 28.12.2012 10:05:48
Ну...
Вот триггер

BEGIN
  UPDATE fh_user u
  SET
    balance = balance + new.charge
  WHERE
    u.id = new.user_id;
END


Как я понимаю, он не может выполниться, потому что таблица fh_user в этой сессии открыта на чтение, т.к. ее приджоинили в запросе?
trew
Дата: 28.12.2012 10:23:04
Hett,

А что за триггер (BEFORE, AFTER) ?
А у таблиц используется механизм хранения MyISAM ?
Также интересен уровень изоляции транзакций 13650169
Hett
Дата: 28.12.2012 10:31:04
ой, я чет только тело триггера скинул

CREATE 
TRIGGER fo.balance_history_after_insert
	AFTER INSERT
	ON fo.fh_balance_history
	FOR EACH ROW
BEGIN
  UPDATE fh_user u
  SET
    balance = balance + new.charge
  WHERE
    u.id = new.user_id;
END


Там в общем-то на все операции триггеры подобные для синхронизации поля.
Таблицы InnoDb
Все обвернуто в одну транзакцию.

grep ISOLATION   /etc/mysql/my.cnf
пустой результат

Сейчас, в общем, делаю через временную таблицу...
javajdbc
Дата: 28.12.2012 17:15:12
Hett,

(не на чем не основаные советы для эксперимента)

Можно сделать подселект в
попытке избежать связки между селектом и тригером.

что-то типа

update balanses
set ...........
where balance.user_id in (select user.id from user where ......)
and .............


если такое сработает, то надо посмотреть не сбились ли индексы.

еше (не совсем по теме) вопрос про LEFT жоинт -- он действительно ЛЕФТ ?
Ниже есть группировка по Ю.ИД,
да и в исерт/селекте наверно должен быть Ю.ИД ????.