Как я могу установить максимальное количество строк в таблице MySQL?
Мне нужно установить максимальный предел строк в моей таблице MySQL. Документация говорит нам, что можно использовать следующий код SQL для создания таблицы:
CREATE TABLE `table_with_limit`
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB MAX_ROWS=100000
Но MAX_ROWS
Свойство не является жестким ограничением ("храните не более 100 000 строк и удаляйте другие"), но подсказкой для механизма базы данных является то, что в этой таблице будет по крайней мере 100 000 строк.
Единственно возможный способ решения проблемы - использовать BEFORE INSERT
триггер, который проверит количество строк в таблице и удалит более старые строки. Но я уверен, что это огромный перегрев:/
Другое решение - очищать таблицу скриптом cron каждые N минут. Это самый простой способ, но все же ему нужна другая система, за которой нужно следить.
Кто-нибудь знает лучшее решение?:)
4 ответа
Попробуйте наложить ограничение на добавление новой записи в таблицу. Поднимите ошибку, когда новая запись будет добавлена.
DELIMITER $$
CREATE TRIGGER trigger1
BEFORE INSERT
ON table1
FOR EACH ROW
BEGIN
SELECT COUNT(*) INTO @cnt FROM table1;
IF @cnt >= 25 THEN
CALL sth(); -- raise an error
END IF;
END
$$
DELIMITER ;
Обратите внимание, что операция COUNT может быть медленной на больших таблицах InnoDb.
В MySQL 5.5 вы можете использовать инструкцию SIGNAL // RESIGNAL, чтобы вызвать ошибку.
- Создайте таблицу с 100 000 строк.
- Предварительно заполните одно из полей "отметкой времени" в прошлом.
- Выберите самую старую запись, обновите "отметку времени" при "создании" (обновлении) записи.
- Используйте только выбор и обновление - никогда не используйте вставку или удаление.
- Обратный индекс в поле "отметка времени" ускоряет выбор / обновление.
Нет никакого способа ограничить максимальное количество строк таблицы в MySQL, если вы не напишите Trigger для этого.
Я просто придумываю ответ из головы. Я предполагаю, что вам нужно что-то вроде "корзины", куда вы помещаете записи, и что вы хотите очистить ее до того, как она достигнет определенного числа записей.
После оператора вставки запустите SELECT LAST_INSERT_ID();
который получит автоматическое увеличение идентификатора записи. Да, вам все равно придется выполнить дополнительный запрос, но он будет ресурсоемким. Как только вы достигнете определенного значения, обрежьте таблицу и сбросьте идентификатор автоматического увеличения.
В противном случае у вас не может быть "закрытой" таблицы в mysql, поскольку у вас должны быть заранее определенные действия, такие как (не разрешаем ли мы запись, усекаем ли мы таблицу? И т. Д.).