SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 12.01.2013 09:52:13

maxyer
Участник
Зарегистрирован: 12.01.2013
Сообщений: 13

можно ли создать такой триггер

Скажите пожалуйста - мне нужно, чтобы при update записей одной таблицы изменялся флаг в записи другой таблицы.
Если обновляется только одна запись, все хорошо - сделал триггер и готово.
Но если я обновляю сразу, допустим, 20 записей, триггер тоже сработает 20 раз ?
В моем случае это не годится - нужно запустить триггер после окончания всех UPDATE-ов.
Как это лучше реализовать ?

Неактивен

 

#2 12.01.2013 13:46:39

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: можно ли создать такой триггер

maxyer написал:

Но если я обновляю сразу, допустим, 20 записей, триггер тоже сработает 20 раз ?

Да.

maxyer написал:

В моем случае это не годится - нужно запустить триггер после окончания всех UPDATE-ов.
Как это лучше реализовать ?

Разве что хранимая процедура с помощью которой будет производиться обновление.

А почему не подходит запуск триггера после обновления каждой записи?

Неактивен

 

#3 12.01.2013 14:16:32

maxyer
Участник
Зарегистрирован: 12.01.2013
Сообщений: 13

Re: можно ли создать такой триггер

vasya написал:

Разве что хранимая процедура с помощью которой будет производиться обновление.

А вызывать эту процедуру я буду уже сам из своего приложения ?

А почему не подходит запуск триггера после обновления каждой записи?

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

Отредактированно maxyer (12.01.2013 14:18:21)

Неактивен

 

#4 12.01.2013 14:32:10

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: можно ли создать такой триггер

maxyer написал:

vasya написал:

Разве что хранимая процедура с помощью которой будет производиться обновление.

А вызывать эту процедуру я буду уже сам из своего приложения ?

Да.

maxyer написал:

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

Вы не усложняете? Достаточно после обновления каждой записи триггером проверять наличие соответствия для данной записи, и, соответственно, ставить или нет флаг.

Неактивен

 

#5 12.01.2013 14:59:45

maxyer
Участник
Зарегистрирован: 12.01.2013
Сообщений: 13

Re: можно ли создать такой триггер

vasya написал:

Вы не усложняете? Достаточно после обновления каждой записи триггером проверять наличие соответствия для данной записи, и, соответственно, ставить или нет флаг.

Sorry, не понял ;(
Мне кажется, без вникания в предметную область продолжение разговора не имеет смысла.
Впрочем, если желаете, я могу расписать все подробно wink

Неактивен

 

#6 12.01.2013 15:10:12

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: можно ли создать такой триггер

Распишите.

Неактивен

 

#7 12.01.2013 16:06:55

maxyer
Участник
Зарегистрирован: 12.01.2013
Сообщений: 13

Re: можно ли создать такой триггер

Таблица 'Ученики/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 выставлены оценки по данному предмету.
Флаг вычисляется следующим образом


SELECT max(case when mark is not null then 1 else 0 end) AS filled
FROM links
JOIN students ON students.group_id=links.group_id
LEFT OUTER JOIN attestat ON attestat.stud_id=students.id AND attestat.subj_id=links.subj_id
WHERE links.group_id=1 AND links.subj_id=1
 


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

Неактивен

 

#8 12.01.2013 17:57:14

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: можно ли создать такой триггер

Этот запрос выдаст 1 если в группе будет хотя бы один студент получивший оценку.

А так, да. После группового обновления оценок запускать проверку.

Неактивен

 

#9 12.01.2013 18:03:14

maxyer
Участник
Зарегистрирован: 12.01.2013
Сообщений: 13

Re: можно ли создать такой триггер

vasya написал:

Этот запрос выдаст 1 если в группе будет хотя бы один студент получивший оценку.

Это и нужно.

А так, да. После группового обновления оценок запускать проверку.

Т.е. триггер здесь не подойдет и нужно писать хранимую процедуру ?

ЗЫ. Говорят, в некоторых СУБД есть триггеры, работающие нужным мне образом.
Кстати, если в MySQL таких триггеров нет, то зачем тогда синтаксис создания триггера включает в себя FOR EACH ROW, если другого не дано ?

Неактивен

 

#10 12.01.2013 18:15:27

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: можно ли создать такой триггер

maxyer написал:

Т.е. триггер здесь не подойдет и нужно писать хранимую процедуру ?

Можно триггером после добавления записи в attestat ставить соответствующий filled 1.
Перерасход невелик, так как новые оценки ставят редко.

maxyer написал:

Кстати, если в MySQL таких триггеров нет, то зачем тогда синтаксис создания триггера включает в себя FOR EACH ROW, если другого не дано ?

Это означает, что триггер будет срабатывать для каждой измененной строки. Например, триггер на update, если будет изменено 10 строк, то и триггер сработает 10 раз.

Неактивен

 

#11 12.01.2013 18:58:05

maxyer
Участник
Зарегистрирован: 12.01.2013
Сообщений: 13

Re: можно ли создать такой триггер

vasya написал:

maxyer написал:

Т.е. триггер здесь не подойдет и нужно писать хранимую процедуру ?

Можно триггером после добавления записи в attestat ставить соответствующий filled 1.

Да, но тот, кто ставит оценку, может передумать и впоследствии удалить ее.
Тогда все равно придется вычислять filled по полной программе с учетом наличия/отсутствия других оценок.

ЗЫ. Сейчас уже тема имеет чисто теоретический характер, т.к. в принципе проблему я решил созданием метода updateFilled() в модели данных (разработка ведется на Yii).
Несколько костыльно, но от использования хранимой процедуры, как мне кажется, не сильно отличается.

Неактивен

 

#12 12.01.2013 20:00:47

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: можно ли создать такой триггер

maxyer написал:

vasya написал:

maxyer написал:

Т.е. триггер здесь не подойдет и нужно писать хранимую процедуру ?

Можно триггером после добавления записи в attestat ставить соответствующий filled 1.

Да, но тот, кто ставит оценку, может передумать и впоследствии удалить ее.
Тогда все равно придется вычислять filled по полной программе с учетом наличия/отсутствия других оценок.

Да, но это редкое событие и для него понадобится ещё один триггер на delete.

Неактивен

 

#13 13.01.2013 08:53:37

maxyer
Участник
Зарегистрирован: 12.01.2013
Сообщений: 13

Re: можно ли создать такой триггер

vasya написал:

Да, но тот, кто ставит оценку, может передумать и впоследствии удалить ее.
Тогда все равно придется вычислять filled по полной программе с учетом наличия/отсутствия других оценок.

Да, но это редкое событие и для него понадобится ещё один триггер на delete.

Удаление - это не физическое удаление записи, а опять-таки UPDATE но значением NULL wink

Неактивен

 

Board footer

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