假设我有一列用户ID存储过去的登录成功。
现在,我只想要最近的20次登录尝试,那么有没有办法指定表不能为每个用户ID存储超过20条记录?
答案 0 :(得分:3)
有几种可能的方法,一种是使用存储过程来插入记录。这样,SP会在插入新的之后检查是否有超过20个并丢弃旧的。缺点是,如果您手动插入一行,它将不会被删除。
trigger可能有效...创建一个AFTER INSERT
触发器,然后删除旧的登录名> 20 ...
答案 1 :(得分:2)
不,这是不可能的。
有两种方法:
答案 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添加适当的过滤逻辑。如果您一次只为一个用户插入一行,这应该非常简单......