MySQL:如何限制为列值存储的记录数?

时间:2010-08-24 15:52:47

标签: mysql

假设我有一列用户ID存储过去的登录成功。

现在,我只想要最近的20次登录尝试,那么有没有办法指定表不能为每个用户ID存储超过20条记录?

3 个答案:

答案 0 :(得分:3)

有几种可能的方法,一种是使用存储过程来插入记录。这样,SP会在插入新的之后检查是否有超过20个并丢弃旧的。缺点是,如果您手动插入一行,它将不会被删除。

trigger可能有效...创建一个AFTER INSERT触发器,然后删除旧的登录名> 20 ...

答案 1 :(得分:2)

不,这是不可能的。

有两种方法:

  • 定期从表中删除行,以便保留20行。
  • 插入行且行数超过20行时,请更新现有行而不是插入行。

答案 2 :(得分:1)

我不相信您可以指定仅存储一定数量的记录,但您可以控制新记录插入的行为。 MySQL为您提供了一些非标准工具,可以在没有sprocs或触发器的情况下帮助实现它。请看这个链接:http://www.xaprb.com/blog/2007/01/11/how-to-implement-a-queue-in-sql/

该文章中的描述非常详尽,我在此不再重复。总而言之,您使用MySQL的REPLACE命令而不是INSERT,或者使用ON DUPLICATE KEY UPDATE语句作为INSERT查询的一部分。将它与一个带有两个唯一键的表结合起来......

  

此表有两个唯一键:一个用作单调递增的“行号”,另一个用于使环绕效果起作用。唯一真实的数据是水果专栏。这是一个将“apples”插入队列的查询:

insert into q(id, modulo, fruit)
 select
  (coalesce(max(id), -1) + 1),
  (coalesce(max(id), -1) + 1) mod 5,
  'apples'
 from q
  on duplicate key update
     id    = values(id),
     fruit = values(fruit)
  

这是查询的作用:它在表中找到id的最大值,因为它被索引后应该是高效的。如果没有行,则结果为NULL,COALESCE()将其转换为-1。然后它将该值加1,这将成为id序列中的下一个最大值。我在这里真正做的是滚动我自己的AUTO_INCREMENT,稍微扭曲:序列从零开始,而不是一个。

等。有关(许多)更多详细信息,请参阅链接。 :)

请注意,对于您的情况(因为您希望每个用户维护20条记录),您需要通过UserID添加适当的过滤逻辑。如果您一次只为一个用户插入一行,这应该非常简单......