2010-08-24 58 views

回答

3

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

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

2

不,这是不可能的。

有两种方式:

  • 定期从表中删除行,让20行仍然存在。
  • 当插入一行并且有超过20行时,更新现有行而不是插入它。
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查询的一部分。将它与一个带有两个唯一键的表结合在一起...

此表有两个唯一键:一个用作单调增加的“行号”,另一个用于使换行效果起作用。唯一真实的数据是水果专栏。这里有一个查询中插入“苹果”到队列:

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。然后它为该值添加一个值,该值将成为id序列中下一个最大的值。我在这里真正做的是滚动我自己的AUTO_INCREMENT,稍微扭曲一下:序列从零开始,而不是一个。

等请参阅(许多)更多细节的链接。 :)

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