| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > MySQL > Триггер и рекурсивная процедура |
| Автор: Shogun 9.12.2010, 19:16 | ||||||
| Добрый вечер всем! Есть таблица items: item_id | parent_id | progress ----------------------------------- 1 0 0 Создаю следующий триггер к этой таблице для вставки:
При вставке новой записи, процедура должна пройтись по всем родителям и обновить ихний прогресс. Собственно при вставке:
то в результате, прогресс записи с ид 1 должен стать 50. триггер добавился, процедура тоже, но при добавления этих новых записей прогресс у родителя не обновляется (( помогите пожалуйста кто знает как решить или что я не правильно сделал. пс : это мои первые опыты с триггерами и процедурами, так что просьба ногами не бить... =)) версия mysql 5.1.40 немного разобрался, теперь триггер вызывается и процедура тоже, но при вставке выходит ошибка: #1442 - Can't update table 'items' in stored function/trigger because it is already used by statement which invoked this stored function/trigger. как я понял тут, нельзя работать с той таблицей у которой сработал триггер, но тогда как мне добится нужного результата? Помогите пожалуйста... (( Спасибо! ;) |
| Автор: Shogun 11.12.2010, 00:19 |
| Знает ли кто что я не правильно тут сделал?? можете помочь? |
| Автор: Shogun 11.12.2010, 13:42 |
| Zloxa, хмм а я то думал в оракле и других серьозных бд этой проблемы нет... Если кто поможет кодом для моей задачей буду очень благодарен. А может есть более традиционные подходы к решению такой проблемы?? |
| Автор: Shogun 14.12.2010, 19:17 | ||
Попробовал с помощью вью.
и в процедуре update_item_progress заменил название таблицы на название вью. Но это тоже не прошло (( таже ошибка 1442 Может кто помочь? Можно ли ваше с помощью триггера и процедуры решить такую задачу или придется по прежнему все это делать через "одно место"?? |
| Автор: azesmcar 14.12.2010, 20:55 | ||
| http://forums.mysql.com/read.php?99,122354,240978#msg-240978 вроде бы нету пока решения. Добавлено через 2 минуты и 10 секунд
Можно обновлять не через запрос а через процедуры, из нее же вызывать update_item_progress а триггер убрать. |
| Автор: Shogun 14.12.2010, 21:16 | ||
azesmcar, ясно, жаль...
ну да, update_item_progress и есть процедура через которую обновляю рекурсивно, а триггер просто нужен был для того чтоб автоматически после вставки вызвать эту процедуру, а так придется это делать вручную. |
| Автор: azesmcar 14.12.2010, 21:35 | ||
неправильно выразился, имелось ввиду вставлять запись с помощью процедуры, из нее же вызывать update_item_progress. Т.е. вместо пары insert и trigger иметь одну процедуру, которая будет делать вставку и функцию, которая была возложена на триггер. |
| Автор: Shogun 14.12.2010, 22:21 | ||
ааа, неплохое решение вроде, спасибо попробую, но тут могут быть и неудобства при таблицах с многими полями как мне кажется, плюс есть еще риск если запись не добавится, или можно это в процедуре проверить? а на производительность это сильно отразится? Спасибо. |
| Автор: azesmcar 15.12.2010, 05:42 | ||||
не думаю, запрос на insert со многими полями будет смотреться в коде хуже чем вызов процедуры. Запросу должны быть переданы как значения, так и сами поля, а процедуре можно не передавать.
конечно, это может быть и функция, возвращающая код ошибки, можно еще посмотреть есть ли в mysql исключения. |