Вы не можете использовать триггер, чтобы сделать это.Я бы сделал это с транзакцией, вызванной из кода приложения.
BEGIN;
INSERT INTO log ...;
SELECT id INTO @id FROM log ORDER BY id DESC LIMIT 1 OFFSET 100;
DELETE FROM log WHERE id <= @id;
COMMIT;
Если в таблице меньше 100 строк, она присвоит NULL значение @id
, а команда DELETE не удалит строки.
Если в таблице более 100 строк, ей будет присвоено @id
идентификатор строки 100 строк от конца.Затем DELETE удалит эту строку и все предыдущие строки, оставив только 100 строк.Использование этого многошагового метода лучше, чем простое удаление, где id
Существует условие гонки , если у вас естьнесколько клиентов делают это одновременно.То есть возможно, что два одновременных сеанса будут и выбирать, и удалять.Это может привести к тому, что общее количество строк будет временно больше 100, по крайней мере до следующей вставки строки и удаления лишних строк.