SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 17.06.2011 21:03:19

Bytex
Участник
Зарегистрирован: 17.06.2011
Сообщений: 2

Создание триггера обрабатывающий одну строку

Есть 4 таблицы:
Книги, читатели, жанр, Ведомость

Из них в триггере используется:
с таблицы "Книги" - ИД Книги и ИД Жанра,
с Читателей - ИД читателя
с Жанра - ИД жанра и пеня (В случае не возврата книги определенного жанра начисляется пеня, сдесь она задана как за один день)

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

Пробовал сделать двумя способами:

Способ №1:

delimiter //
Create trigger Set_pen before insert ON  result  FOR EACH ROW
Begin
select ((To_days(NEW.Date_return)-TO_DAYS(NEW.Date_take)-genre.Can_take)*genre.penalty) into @tot
from result, genre, books, readers
where (To_DAYS(NEW.date_return)-TO_DAYS(NEW.Date_take)>genre.Can_take)
and (books.ID_book=NEW.ID_book)
and (books.genre=genre.ID_genre)
and (NEW.ID_read=readers.ID_read);
SET NEW.penalty= @tot;
end//
 

Result - ведомость
Genre - Жанр
Books - Книги
Readers - Читатели

Выдает ошибку: Result consisted of more than one row

Второй способ:
Создал процедуру, но она вычисляет для всей таблицы пеню... А нужно только одну запись.

Подскажите кто-то как можна исправить ситуацию?

Неактивен

 

#2 18.06.2011 19:09:47

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Создание триггера обрабатывающий одну строку

Очень тяжело разобраться в таком количестве таблиц. Видимо, где-то что-то
с условиями не так — достается более одной строки. Можете, например, дописать
LIMIT 1 в конце SELECT в качестве костылика. Это исправит текущую ошибку, но
не исправит логическую — Вы просто проигнорируете остальные строки.

Неактивен

 

#3 19.06.2011 11:25:44

Bytex
Участник
Зарегистрирован: 17.06.2011
Сообщений: 2

Re: Создание триггера обрабатывающий одну строку

Да мне другие строки и не нужны, лишь та которую добавляю.
-----------------------------------------------------------------
Не знаю каким образом но с лимитом работает отлично как нужно:

delimiter //
Create trigger Set_pen before insert ON  result  FOR EACH ROW
Begin
select ((To_days(NEW.Date_return)-TO_DAYS(NEW.Date_take)-genre.Can_take)*genre.penalty) into @tot
from result, genre, books, readers
where (To_DAYS(NEW.date_return)-TO_DAYS(NEW.Date_take)>genre.Can_take)
and (books.ID_book=NEW.ID_book)
and (books.genre=genre.ID_genre)
and (NEW.ID_read=readers.ID_read) limit 1;
SET NEW.penalty= @tot;
end//
 

Отредактированно Bytex (19.06.2011 23:47:56)

Неактивен

 

Board footer

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