2010-05-09 3 views
0

Основной вопрос, извините. В принципе, у меня есть скрипт, который создает запись MySQL каждый раз, когда кто-то посещает страницу. Скрипт ведения журнала. Тем не менее, я хочу сделать это autoprune после, скажем, 100 посещений.Автозапуск после определенного количества строк?

Например, в псевдокоде:

if amount of rows > 100 { delete rows 1+ until amount of rows == 100 }

Таким образом, в двух словах, каждый раз, когда новая строка добавляется после 100, он должен автоматически удалить строку с наименьшим идентификатором (Мой первичный ключ) ,

+0

Как быстро происходят эти ВСТАВКИ? Мы говорим о секундах, часах, днях, ...? – VolkerK

+0

Он варьируется, конечно, в зависимости от времени суток, но между секундами в часы пик и от минут до часов в нерабочее время – Rob

ответ

0

Другим возможным вариантом было бы использовать базу данных Триггеры (http://forge.mysql.com/wiki/Triggers)

Это может быть излишним в этом случае, но будет проверить таблицу каждый раз, когда ро w вставлен. Пример (!, Который я не проверял):

Создание триггера prune_MyTable ПОСЛЕ ВСТАВИТЬ на MyTable для каждой строки НАЧАТЬ DECLARE num_rows INTEGER; DECLARE lower_id INTEGER;

SELECT COUNT (*) INTO num_rows FROM MyTable;

IF num_rows> 100 THEN ВЫБЕРИТЕ МИН (id) INTO lower_id FROM MyTable LIMIT 100;

ОБНОВЛЕНИЕ MyTable УДАЛИТЬ ГДЕ id < lower_id;

END IF; END $$

0

Скорее всего, вам необходимо заблокировать таблицу, чтобы получить счет, а затем удалить «правильное» количество старых записей. Поэтому я бы скорее ограничил SELECT до 100 строк и сохранил больше записей в таблице, даже если они являются излишними. Вы можете удалить старые записи, например. с хрон работу один раз в несколько часов или со случайной вероятностью х на милю:

if (10 > rand(0, 8000)) { 
    LOCK TABLES foo 
    SELECT COUNT(*) as cnt FROM foo 
    if ($cnt > 100) { 
    $cnt -= 100; 
    DELETE FROM foo ORDER BY id DESC LIMIT $cnt 
    } 
    UNLOCK TABLES 
} 

или что-то в этом роде ...

(насколько я знаю, ORDER BY и LIMIT пункта для УДАЛИТЬ заявления MySQL специфичны. Лучше имейте это в виду.)