如何在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,是否截断表格等等)。