SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 22.10.2009 20:16:07

Robbie
Участник
Зарегистрирован: 22.10.2009
Сообщений: 8

Проблема с удалением старых записей в таблице триггером

Есть таблица 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;
$$

Нужно срочно на завтра сделать. Буду очень благодарен!

Неактивен

 

#2 22.10.2009 20:29:21

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

Re: Проблема с удалением старых записей в таблице триггером

Пардон, был не прав. Невнимательно прочитал сообщение roll

Неактивен

 

#3 22.10.2009 20:39:34

Robbie
Участник
Зарегистрирован: 22.10.2009
Сообщений: 8

Re: Проблема с удалением старых записей в таблице триггером

Если вдруг что-то не понятно, то укажите, я все распишу.

Просто мне горит, а я сам не знаю как сделать это.

Неактивен

 

#4 22.10.2009 20:53:38

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

Re: Проблема с удалением старых записей в таблице триггером

delimiter $$
create trigger b_ai after insert on b
for each row
begin
  select count(*) into @n from a;
  if @n = 5 then begin
    select min(b_id) into @min from a;
    delete from a where b_id = @min;
    end;
  end if;
  insert into a values(new.id);
end$$


Лень исправлять имена колонок и таблиц на ваши, надеюсь идея понятна.

Неактивен

 

#5 22.10.2009 20:57:03

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

Re: Проблема с удалением старых записей в таблице триггером

В качестве обучающего примера рекомендую посмотреть статью http://webew.ru/articles/2080.webew
В конце статьи с очень подробными комментариями приведен пример реализации иерархического меню с помощью хранимого кода MySQL.

Неактивен

 

#6 22.10.2009 21:37:14

Robbie
Участник
Зарегистрирован: 22.10.2009
Сообщений: 8

Re: Проблема с удалением старых записей в таблице триггером

Вот переписал в таком виде:

Код:

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' "

Неактивен

 

#7 22.10.2009 21:52:12

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

Re: Проблема с удалением старых записей в таблице триггером

select min(orders.ID_or) into @min from log;
    delete from log where orders.ID_or = @min;

Здесь вместо orders.ID_or должно быть имя колонки в таблице `log`. В вашем случае это n_id.

Неактивен

 

#8 22.10.2009 21:56:05

Robbie
Участник
Зарегистрирован: 22.10.2009
Сообщений: 8

Re: Проблема с удалением старых записей в таблице триггером

Да, да, да. Я уже пришел к этому. Вот код, но он не удаляет ничего...

Код:

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-ую и т.д. не удаляя минимальную. Я не могу понять почему.
Спасибо за помощь, но она мне требуется еще smile

Очень жду)

Отредактированно Robbie (22.10.2009 21:58:07)

Неактивен

 

#9 22.10.2009 22:15:24

Robbie
Участник
Зарегистрирован: 22.10.2009
Сообщений: 8

Re: Проблема с удалением старых записей в таблице триггером

ВСЕ! Работает! Я просто немножко ошибся в последнем варианте кода, представленном здесь.

Вот он:

Код:

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, огромнейшее спасибо! Расцеловал бы! smile

Я бы не додумался пойти по путям переменных. Я сначала сделал так:

Код:

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, еще раз огромное спасибо! Очень выручил! Надеюсь, все будет в порядке, сдам.

Неактивен

 

#10 22.10.2009 22:17:47

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

Re: Проблема с удалением старых записей в таблице триггером

Ну, шестую он должен пустить, так как у вас if @n > 5.
А вот в остальномroll

Покажите show create table log;

Неактивен

 

#11 22.10.2009 22:20:49

Robbie
Участник
Зарегистрирован: 22.10.2009
Сообщений: 8

Re: Проблема с удалением старых записей в таблице триггером

vasya, wink

Неактивен

 

Board footer

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