Задавайте вопросы, мы ответим
Вы не зашли.
Скажите пожалуйста - мне нужно, чтобы при update записей одной таблицы изменялся флаг в записи другой таблицы.
Если обновляется только одна запись, все хорошо - сделал триггер и готово.
Но если я обновляю сразу, допустим, 20 записей, триггер тоже сработает 20 раз ?
В моем случае это не годится - нужно запустить триггер после окончания всех UPDATE-ов.
Как это лучше реализовать ?
Неактивен
maxyer написал:
Но если я обновляю сразу, допустим, 20 записей, триггер тоже сработает 20 раз ?
Да.
maxyer написал:
В моем случае это не годится - нужно запустить триггер после окончания всех UPDATE-ов.
Как это лучше реализовать ?
Разве что хранимая процедура с помощью которой будет производиться обновление.
А почему не подходит запуск триггера после обновления каждой записи?
Неактивен
vasya написал:
Разве что хранимая процедура с помощью которой будет производиться обновление.
А вызывать эту процедуру я буду уже сам из своего приложения ?
А почему не подходит запуск триггера после обновления каждой записи?
Специфика предметной области.
Мне нужно выставить флаг, что в связанной таблице появилась хоть одна запись.
Т.е. я себе так представляю эту процедуру: в ее теле происходит запрос к связанной таблице, который выбирает все подчиненные записи и по их содержимому судит, ставить флаг или нет. Мне кажется, такой запрос нецелесообразно делать после обновления каждой записи.
Отредактированно maxyer (12.01.2013 14:18:21)
Неактивен
maxyer написал:
vasya написал:
Разве что хранимая процедура с помощью которой будет производиться обновление.
А вызывать эту процедуру я буду уже сам из своего приложения ?
Да.
maxyer написал:
Специфика предметной области.
Мне нужно выставить флаг, что в связанной таблице появилась хоть одна запись.
Т.е. я себе так представляю эту процедуру: в ее теле происходит запрос к связанной таблице, который выбирает все подчиненные записи и по их содержимому судит, ставить флаг или нет. Мне кажется, такой запрос нецелесообразно делать после обновления каждой записи.
Вы не усложняете? Достаточно после обновления каждой записи триггером проверять наличие соответствия для данной записи, и, соответственно, ставить или нет флаг.
Неактивен
vasya написал:
Вы не усложняете? Достаточно после обновления каждой записи триггером проверять наличие соответствия для данной записи, и, соответственно, ставить или нет флаг.
Sorry, не понял ;(
Мне кажется, без вникания в предметную область продолжение разговора не имеет смысла.
Впрочем, если желаете, я могу расписать все подробно
Неактивен
Распишите.
Неактивен
Таблица 'Ученики/students'
id | name | group
-----------------
1 | Иванов | 1
2 | Петров | 2
Таблица 'Предметы/subjects'
id | name
------------
1 | Математика
2 | Физика
3 | Информатика
Таблица 'Учебные планы/links'
group_id | subj_id | filled
------------------------------------
1 | 1 | 0
1 | 2 | 1
1 | 3 | 1
2 | 1 | 0
2 | 3 | 0
Таблица 'Оценки/attestat'
stud_id | subj_id | mark
-------------------------
1 | 1 | 3
2 | 1 | 4
Таблицы, о которых идет речь, - attestat и links
Запись таблицы links содержит информацию о том, что группой group_id изучается предмет subj_id, а поле filled и есть тот самый флаг, который говорит, что студентам данной группы в таблице attestat выставлены оценки по данному предмету.
Флаг вычисляется следующим образом
Неактивен
Этот запрос выдаст 1 если в группе будет хотя бы один студент получивший оценку.
А так, да. После группового обновления оценок запускать проверку.
Неактивен
vasya написал:
Этот запрос выдаст 1 если в группе будет хотя бы один студент получивший оценку.
Это и нужно.
А так, да. После группового обновления оценок запускать проверку.
Т.е. триггер здесь не подойдет и нужно писать хранимую процедуру ?
ЗЫ. Говорят, в некоторых СУБД есть триггеры, работающие нужным мне образом.
Кстати, если в MySQL таких триггеров нет, то зачем тогда синтаксис создания триггера включает в себя FOR EACH ROW, если другого не дано ?
Неактивен
maxyer написал:
Т.е. триггер здесь не подойдет и нужно писать хранимую процедуру ?
Можно триггером после добавления записи в attestat ставить соответствующий filled 1.
Перерасход невелик, так как новые оценки ставят редко.
maxyer написал:
Кстати, если в MySQL таких триггеров нет, то зачем тогда синтаксис создания триггера включает в себя FOR EACH ROW, если другого не дано ?
Это означает, что триггер будет срабатывать для каждой измененной строки. Например, триггер на update, если будет изменено 10 строк, то и триггер сработает 10 раз.
Неактивен
vasya написал:
maxyer написал:
Т.е. триггер здесь не подойдет и нужно писать хранимую процедуру ?
Можно триггером после добавления записи в attestat ставить соответствующий filled 1.
Да, но тот, кто ставит оценку, может передумать и впоследствии удалить ее.
Тогда все равно придется вычислять filled по полной программе с учетом наличия/отсутствия других оценок.
ЗЫ. Сейчас уже тема имеет чисто теоретический характер, т.к. в принципе проблему я решил созданием метода updateFilled() в модели данных (разработка ведется на Yii).
Несколько костыльно, но от использования хранимой процедуры, как мне кажется, не сильно отличается.
Неактивен
maxyer написал:
vasya написал:
maxyer написал:
Т.е. триггер здесь не подойдет и нужно писать хранимую процедуру ?
Можно триггером после добавления записи в attestat ставить соответствующий filled 1.
Да, но тот, кто ставит оценку, может передумать и впоследствии удалить ее.
Тогда все равно придется вычислять filled по полной программе с учетом наличия/отсутствия других оценок.
Да, но это редкое событие и для него понадобится ещё один триггер на delete.
Неактивен
vasya написал:
Да, но тот, кто ставит оценку, может передумать и впоследствии удалить ее.
Тогда все равно придется вычислять filled по полной программе с учетом наличия/отсутствия других оценок.Да, но это редкое событие и для него понадобится ещё один триггер на delete.
Удаление - это не физическое удаление записи, а опять-таки UPDATE но значением NULL
Неактивен