如何在MySQL表中设置最大行数?
我需要在我的MySQL表中设置最大行数限制。 文档告诉我们可以使用下面的SQL代码来创build表格:
CREATE TABLE `table_with_limit` `id` int(11) DEFAULT NULL ) ENGINE=InnoDB MAX_ROWS=100000
但MAX_ROWS
属性不是一个硬限制(“存储不超过100000行和删除其他”),但提示数据库引擎,该表将至less有100 000行。
我看到解决问题的唯一可能的方法是使用BEFORE INSERT
触发器,它将检查表中的行数并删除较旧的行。 但我很确定这是一个巨大的过热:/
另一个解决scheme是每隔N分钟用cron脚本清除表格。 这是最简单的方法,但仍然需要另一个系统来监视。
谁都知道更好的解决scheme? 🙂
尝试限制向表中添加新logging。 在添加新logging时引发错误。
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操作可能会很慢。
在MySQL 5.5上,您可以使用SIGNAL语句来引发错误。
- 创build一个包含100,000行的表格。
- 在过去,预填一个“时间戳”字段。
- select最旧的logging,在“创build”(更新)logging时更新“时间戳”。
- 只使用select和更新 – 不要使用插入或删除。
- “时间戳”字段上的反向索引使得select/更新更快。
除非你写了一个触发器来做这件事,否则没有办法限制MySQL中表格行的最大数量。
我只是在回答我的头顶。 我的假设是,你想要一个像“桶”的东西,你把它放在logging中,并且你想在它达到特定的logging数量之前清空它。
在插入语句之后,运行SELECT LAST_INSERT_ID();
这将让你自动增加一个loggingID。 是的,你仍然需要运行一个额外的查询,但是资源密集度很低。 一旦达到一定数量, 截断表格并重置自动递增ID 。
否则,你不能在mysql中有一个'capped'表,因为你必须有预定义的行为,比如(我们不允许logging,是否截断表格等等)。