powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Автоочитска триггером или процедурой таблицы с логами
9 сообщений из 9, страница 1 из 1
Автоочитска триггером или процедурой таблицы с логами
    #38588146
Artemprodigy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день! Есть таблица "test"

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `test` (
	`id` BIGINT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
	`content` TEXT NOT NULL,
	PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM



и нужно чтоб в ней хранилось не больше 10 записей, тоесть при добавлении 11, первая запись удалялась. Я пробовал вот такой триггер

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE DEFINER=`Monitor`@`%` TRIGGER `test_before_insert` AFTER INSERT ON `test` FOR EACH ROW BEGIN
DECLARE n integer;
DECLARE m integer;
select count(*) into @n from test;
  if @n = 10 then begin
    select min(test.id) into @m from test;
    delete from test where test.id = @m;
    end;
  end if;
END



Но он выдаёт ошибку 1442. Как можно автоматизировать очистку ещё?
...
Рейтинг: 0 / 0
Автоочитска триггером или процедурой таблицы с логами
    #38588160
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Без никакого триггера. Просто вместо INSERT делайте UPDATE самой старой записи.
...
Рейтинг: 0 / 0
Автоочитска триггером или процедурой таблицы с логами
    #38588166
Artemprodigy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, а автоматизировать никак? Это мне перед каждым инсертом нужно делать проверку на id, а потом решать что делать? И мне нужно чтоб id дальше инкрементировался....
...
Рейтинг: 0 / 0
Автоочитска триггером или процедурой таблицы с логами
    #38588180
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ArtemprodigyИ мне нужно чтоб id дальше инкрементировался....ну и инкрементируйте тем же UPDATE-ом, кто мешает?
...
Рейтинг: 0 / 0
Автоочитска триггером или процедурой таблицы с логами
    #38588184
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artemprodigy,

добавляете поле "псевдономер", забиваете 10 пустых записей с псевдономерами 0-9

потом работаете через
Код: sql
1.
2.
3.
update table set <...> -- вот тут ваши новые дынные
 ,pseudonum=pseudonum+10 -- а вот тут мы отмечаем, что эта запись изменилась последней
order by pseudonum limit 1 -- а это чтобы изменять только одну, самую старую, запись

пока писал, подумал, что проще вместо псевдономера добавить поле timestamp on update current timestamp, тогда вообще вот так можно
Код: sql
1.
2.
3.
update table set <...> -- вот тут ваши новые дынные
-- а дата изменения записи обновится автоматически
order by pseudonum limit 1 -- и по-прежнему апдейтим только самую старую запись
...
Рейтинг: 0 / 0
Автоочитска триггером или процедурой таблицы с логами
    #38588194
Artemprodigy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
miksoft, ну а триггером или процедурой можно эту задачу решить?
...
Рейтинг: 0 / 0
Автоочитска триггером или процедурой таблицы с логами
    #38588199
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artemprodigymiksoft, ну а триггером или процедурой можно эту задачу решить?Триггером - нет.
Процедурой можно, если тот же UPDATE поместить в эту процедуру.
...
Рейтинг: 0 / 0
Автоочитска триггером или процедурой таблицы с логами
    #38589477
Artemprodigy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за помощь, сделал всё процедурой:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE DEFINER=`12345`@`%` PROCEDURE `tst_proc`(IN `number` INT)
	LANGUAGE SQL
	NOT DETERMINISTIC
	MODIFIES SQL DATA
	SQL SECURITY DEFINER
	COMMENT ''
BEGIN
DECLARE n, cnt, m, d INT;
SET @cnt = number;
SELECT count(tst.id) into @n from tst;
  if @n > @cnt then begin 
  SET d = @n - @cnt;
		SET @m = (SELECT tst.id
		FROM tst
		ORDER BY tst.id ASC 
		LIMIT d, 1);
		DELETE FROM tst WHERE tst.id < @m;
  		end;
  end if;
END



Всё работает как и хотел. Вариант решения адекватный?
...
Рейтинг: 0 / 0
Автоочитска триггером или процедурой таблицы с логами
    #38589501
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Artemprodigy,

Можно упростить, у DELETE есть LIMIT row_count.

Эта процедура опасна тем, что при параллельном запуске в двух разных сессиях натворит неизвестно чего.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Автоочитска триггером или процедурой таблицы с логами
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]