Задавайте вопросы, мы ответим
Вы не зашли.
Есть таблица Log, есть триггер, который добавляет в эту таблицу дату и айди новой записи в другой таблице - orders.
(В нее триггер должен добавлять id, n_id - это айди новой записи в таблице orders, date - дата добавления записи в orders.)
Задача:
Нужен такой триггер, который бы ограничивал максимальное количество записей в таблице log (к примеру 20): при добавлении новой записи в orders он бы проверял количество записей в log и если уже есть 20 записей, то он должен запись/записи с минимальным/ыми id удалить, затем добавить новую в Log. Таким образом, всегда не более 20 записей с проверкой на минимальный id.
Триггер добавления самих записей в Log есть:
DELIMITER $$ CREATE TRIGGER `update_orders` AFTER INSERT ON `orders` FOR EACH ROW BEGIN INSERT INTO log Set message = 'insert', n_id = NEW.ID_or; END; $$
Нужно срочно на завтра сделать. Буду очень благодарен!
Неактивен
Пардон, был не прав. Невнимательно прочитал сообщение
Неактивен
Если вдруг что-то не понятно, то укажите, я все распишу.
Просто мне горит, а я сам не знаю как сделать это.
Неактивен
Неактивен
В качестве обучающего примера рекомендую посмотреть статью http://webew.ru/articles/2080.webew
В конце статьи с очень подробными комментариями приведен пример реализации иерархического меню с помощью хранимого кода MySQL.
Неактивен
Вот переписал в таком виде:
delimiter $$ create trigger `update_orders` after insert on `orders` for each row begin select count(*) into @n from log; if @n = 5 then begin select min(orders.ID_or) into @min from log; delete from log where orders.ID_or = @min; end; end if; INSERT INTO log Set message = 'insert', n_id = NEW.ID_or; end$$
До 5ти записей нормально, а как только добавляю 6-ую в orders пишет ошибку
" SQL-запрос: Правка
INSERT INTO `orders` ( `ID_or` , `time` , `firstname` , `lastname` , `email` , `address` , `phone` )
VALUES (
'0', '0000-00-00 00:00:00', 'gbf', 'hgf', 'hgf', 'hgf', '5'
)
Ответ MySQL: Документация
#1054 - Unknown column 'orders.ID_or' in 'field list' "
Неактивен
select min(orders.ID_or) into @min from log;
delete from log where orders.ID_or = @min;
Здесь вместо orders.ID_or должно быть имя колонки в таблице `log`. В вашем случае это n_id.
Неактивен
Да, да, да. Я уже пришел к этому. Вот код, но он не удаляет ничего...
delimiter $$ create trigger `update_orders` after insert on `orders` for each row begin select count(id) into @n from log; if @n > 5 then begin select min(n_id) into @min from log; delete from log where n_id = @min; end; end if; INSERT INTO log Set message = 'insert', n_id = NEW.ID_or; end$$
Т.е. после 5ой записи пускает и 6-ую в Лог, и 7-ую и т.д. не удаляя минимальную. Я не могу понять почему.
Спасибо за помощь, но она мне требуется еще
Очень жду)
Отредактированно Robbie (22.10.2009 21:58:07)
Неактивен
ВСЕ! Работает! Я просто немножко ошибся в последнем варианте кода, представленном здесь.
Вот он:
delimiter $$ create trigger `update_orders` after insert on `orders` for each row begin select count(log.id) into @n from log; if @n = 5 then begin select min(n_id) into @min from log; delete from log where n_id = @min; end; end if; INSERT INTO log Set message = 'insert', n_id = NEW.ID_or; end$$
vasya, огромнейшее спасибо! Расцеловал бы!
Я бы не додумался пойти по путям переменных. Я сначала сделал так:
DELIMITER $$ CREATE TRIGGER `update_orders` AFTER INSERT ON `orders` FOR EACH ROW BEGIN DELETE FROM log where id=NEW.ID_or - 30; INSERT INTO log Set message = 'insert', n_id = NEW.ID_or; END; $$
Но тут, если удалить в средине табл orders значение, то в log пойдет путаница. Поэтому мой способ не канал.
vasya, еще раз огромное спасибо! Очень выручил! Надеюсь, все будет в порядке, сдам.
Неактивен
Ну, шестую он должен пустить, так как у вас if @n > 5.
А вот в остальном
Покажите show create table log;
Неактивен
vasya,
Неактивен