Таблица MySQL должна содержать от 80 до 100 строк - PullRequest
0 голосов
/ 26 августа 2018

Для школьного задания мне нужна таблица MySQL, содержащая от 80 до 100 строк (включительно).Задание cron заносит строку в таблицу каждые 2 часа.Я хотел сделать это с помощью триггеров, но, по-видимому, это невозможно, поскольку таблица заблокирована из-за оператора INSERT.Это был триггер, который я использовал:

CREATE TRIGGER too_many_rows
BEFORE INSERT ON log
FOR EACH ROW
BEGIN
    IF (SELECT COUNT(id) FROM log) >= 100 THEN
        DELETE FROM log LIMIT 1;
    END IF;
END

Хитрость в том, что есть также ручные вставки в таблицу, поэтому я не могу периодически проверять (задания CRON или события MySQL), если естьслишком много таблиц, потому что в какой-то момент может быть слишком много строк.Идеальной ситуацией будет удаление самой старой строки каждый раз, когда добавляется новая строка.

Можно ли как-нибудь еще это сделать?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Кажется, то, что я ищу, на самом деле невозможно, и поэтому я использовал событие MySQL для удаления избыточных строк каждый час.

Вот код:

СОБЫТИЕ check_for_redundant_rows

SET GLOBAL event_scheduler = ON;

DELIMITER $$

CREATE EVENT check_for_redundant_rows
ON SCHEDULE EVERY 1 HOUR
STARTS '2018-01-01 00:00:00'
DO
CALL delete_redundant_rows();
$$

DELIMITER ;

ПРОЦЕДУРА delete_redundant_rows ()

DELIMITER $$

CREATE PROCEDURE delete_redundant_rows()
BEGIN
    DECLARE cnt INT DEFAULT 0;

    SELECT COUNT(id)
    INTO cnt
    FROM log;

    SET cnt = cnt - 80;

    DELETE FROM log
    ORDER BY id ASC
    LIMIT cnt;
END
$$

DELIMITER ;
0 голосов
/ 26 августа 2018

Вы не можете использовать триггер, чтобы сделать это.Я бы сделал это с транзакцией, вызванной из кода приложения.

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, по крайней мере до следующей вставки строки и удаления лишних строк.

...