我需要在MySQL表中设置行的最大限制。文档告诉我们可以使用以下SQL代码来创建表:
CREATE TABLE `table_with_limit`
`id` int(11) DEFAULT NULL
) ENGINE=InnoDB MAX_ROWS=100000
但MAX_ROWS
属性不是硬限制(“存储不超过100 000行并删除其他”)但是数据库引擎提示此表将至少有10万行。
我看到解决问题的唯一可行方法是使用BEFORE INSERT
触发器,它将检查表中的行数并删除旧行。但我很确定这是一个巨大的过热:/
另一个解决方案是每隔N分钟使用cron脚本清除表。这是一种最简单的方法,但仍需要另一个系统来监视。
任何人都知道更好的解决方案吗? :)
答案 0 :(得分:11)
尝试限制向表中添加新记录。要添加新记录时引发错误。
DELIMITER $$
CREATE TRIGGER trigger1
BEFORE INSERT
ON table1
FOR EACH ROW
BEGIN
SELECT COUNT(*) INTO @cnt FROM table1;
IF @cnt >= 25 THEN
CALL sth(); -- raise an error
END IF;
END
$$
DELIMITER ;
请注意,对于大型InnoDb表,COUNT操作可能会很慢。
答案 1 :(得分:5)
答案 2 :(得分:3)
除非你编写一个触发器来执行此操作,否则无法限制MySQL中表行的最大数量。
答案 3 :(得分:0)
我只是在我头顶做出答案。我的假设是你需要一个类似于'桶'的东西,你放入记录,并且你想在它达到某个记录数量之前清空它。
在插入语句之后,运行SELECT LAST_INSERT_ID();
,它将获得记录ID的自动增量。是的,你仍然需要运行一个额外的查询,但它将是低资源密集型。达到某个计数后,截断表并重置自动增量ID 。
否则你不能在mysql中有一个'capped'表,因为你必须有预定义的动作,比如(我们不允许记录,我们是否截断了表格等等)。