【问题标题】:How to automatically limit the number of rows in a database?如何自动限制数据库中的行数?
【发布时间】:2012-03-01 04:30:58
【问题描述】:

我有下表

+-----------+------------------+------+-----+---------+----------------+
| 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!即如果用户 ID 5 已经有 10 行,并且我正在插入一个新行,我需要在插入之前删除其中最旧的行。

有没有办法编写一个 SQL 语句来DELETEs 用户 ID 的所有条目,除了最近的 10 个条目。我知道如何将LIMIT 用于SELECT,但我看不到如何在DELETE 中实现LIMIT。

【问题讨论】:

  • 似乎是使用trigger的完美案例
  • @Riki Lyng SQL 不直接提供此功能。正如 bfavaretto 所说,您可以添加一个触发器来删除或限制插入到您的表中。另一种方法是修改调用 MySQL 数据库以限制插入的代码

标签: mysql delete-row sql-delete sql-limit


【解决方案1】:

按照这些思路应该可以工作:

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

-- 添加:其中 userID = xyz

【讨论】:

  • 对不起,这不适用于 MySql。我收到以下错误:此版本的 MySQL 尚不支持 'LIMIT & IN/ALL/ANY/SOME subquery'
  • 下面显示了一个略有不同的子查询语法,但它适用于选择 - 也许它适用于删除:stackoverflow.com/questions/2856397/mysql-subquery-limit
  • 由于您希望该子查询中的行 not,因此您必须加入 ID subquery.ID
【解决方案2】:
DELETE from table
WHERE id NOT IN(
      SELECT id FROM table GROUP BY userid ORDER BY logintime DESC LIMIT 10)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多