Как я могу установить максимальное количество строк в таблице MySQL? - PullRequest
14 голосов
/ 08 ноября 2011

Мне нужно установить максимальный предел строк в моей таблице 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 ]

11 голосов
/ 08 ноября 2011

Попробуйте наложить ограничение на добавление новой записи в таблицу.Выдает ошибку при добавлении новой записи.

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 для выдачи ошибки.

5 голосов
/ 08 ноября 2011
  • Создать таблицу из 100 000 строк.
  • Предварительно заполните одно из полей «штамп времени» в прошлом.
  • Выбрать самую старую запись, обновить «отметку времени» при «создании» (обновлении) записи.
  • Используйте только выбор и обновление - никогда не используйте вставку или удаление.
  • Обратный индекс по полю "отметка времени" составляет выбор / обновление быстро.
3 голосов
/ 08 ноября 2011

Нет никакого способа ограничить максимальное количество строк таблицы в MySQL, если вы не напишите Триггер для этого.

0 голосов
/ 08 ноября 2011

Я просто придумываю ответ с макушки головы.Я предполагаю, что вам нужно что-то вроде «корзины», куда вы помещаете записи, и что вы хотите очистить его до того, как оно достигнет определенного числа записей.

После оператора вставки запустите SELECT LAST_INSERT_ID();, которыйВы получите автоматическое увеличение идентификатора записи.Да, вам все равно придется выполнить дополнительный запрос, но он будет ресурсоемким.Как только вы достигнете определенного значения, обрежьте таблицу и сбросьте идентификатор автоматического приращения .

В противном случае вы не можете иметь «ограниченную» таблицу в MySQL, таку вас должны быть заранее определенные действия, такие как (не разрешаем ли мы запись, усекаем ли мы таблицу и т. д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...