如何在MySQL表中设置最大行数?

时间:2011-11-08 09:01:11

标签: mysql triggers

我需要在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脚本清除表。这是一种最简单的方法,但仍需要另一个系统来监视。

任何人都知道更好的解决方案吗? :)

4 个答案:

答案 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操作可能会很慢。

在MySQL 5.5上,您可以使用SIGNAL // RESIGNAL语句来引发错误。

答案 1 :(得分:5)

  • 创建一个包含100,000行的表。
  • 使用a预填充其中一个字段 过去的“时间戳”。
  • 选择最早的记录,更新“时间戳” 何时“创建”(更新)记录。
  • 仅使用选择和更新 - 永远不要使用插入或删除。
  • “时间戳”字段的反向索引 快速选择/更新。

答案 2 :(得分:3)

除非你编写一个触发器来执行此操作,否则无法限制MySQL中表行的最大数量。

答案 3 :(得分:0)

我只是在我头顶做出答案。我的假设是你需要一个类似于'桶'的东西,你放入记录,并且你想在它达到某个记录数量之前清空它。

在插入语句之后,运行SELECT LAST_INSERT_ID();,它将获得记录ID的自动增量。是的,你仍然需要运行一个额外的查询,但它将是低资源密集型。达到某个计数后,截断表重置自动增量ID

否则你不能在mysql中有一个'capped'表,因为你必须有预定义的动作,比如(我们不允许记录,我们是否截断了表格等等)。