2012-02-08 3 views
2

У меня есть следующая таблицаКак автоматически ограничить количество строк в базе данных?

+-----------+------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-----------+------------------+------+-----+---------+----------------+ 
| ID  | int(11) unsigned | NO | PRI | NULL | auto_increment | 
| userid | int(10) unsigned | NO | MUL | NULL |    | 
| logintime | int(10) unsigned | NO |  | NULL |    | 
| loginIP | int(4) unsigned | NO |  | NULL |    | 
+-----------+------------------+------+-----+---------+----------------+ 

вставить новую строку в этой таблице каждый раз, когда пользователь входит в, которая содержит свое время входа в систему, IP-адрес и т.д. ...

Теперь я хочу, чтобы ограничить количество строк до 10 на пользователя! т. е. если есть 10 строк для userid 5, уже и я вставляю новый, мне нужно удалить самую старую из них до вставки.

есть способ написать инструкцию SQL, которая содержит все записи идентификатора пользователя, за исключением последних 10. Я знаю, как использовать LIMIT для SELECT, но я не вижу, как я могу реализовать LIMIT в DELETE.

+2

Похоже, идеальный случай для использования [триггер] (HTTP: // DEV. mysql.com/doc/refman/5.0/en/triggers.html) – bfavaretto

+0

@Riki Lyng SQL не предоставляет эту функцию напрямую. Как сказал bfavaretto, вы можете добавить триггер, который удаляет или ограничивает вставку в вашу таблицу. Другой способ - изменить код, который вызывает базу данных MySQL, чтобы ограничить вставки. – umlcat

ответ

4

Что-то вдоль этих линий должно работать:

DELETE FROM 
    table 
WHERE 
userID = xyz and id not in (
    SELECT id FROM table WHERE userID = xyz ORDER BY logintime DESC LIMIT 10 
) 

- добавлено: где идентификатор пользователя = хуг

+0

Извините, ребята, это не работает с MySql. Я получаю следующую ошибку: Эта версия MySQL еще не поддерживает «LIMIT & IN/ALL/ANY/SOME subquery» –

+0

Ниже показан немного другой синтаксис подзапроса, но это для выбора - возможно, он будет работать для delete: http://stackoverflow.com/questions/2856397/mysql-subquery-limit –

+0

Поскольку вы хотите, чтобы строки * not * в этом подзапросе, вам нужно будет присоединиться к ID <> subquery.ID –

0
DELETE from table 
WHERE id NOT IN(
     SELECT id FROM table GROUP BY userid ORDER BY logintime DESC LIMIT 10) 
Смежные вопросы