繁体   English   中英

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

[英]How can I set a maximum number of rows in MySQL table?

我需要在 MySQL 表中设置最大行数限制。 文档告诉我们可以使用以下 SQL 代码来创建表:

CREATE TABLE `table_with_limit` 
   `id` int(11) DEFAULT NULL
) ENGINE=InnoDB MAX_ROWS=100000

但是MAX_ROWS属性不是硬限制(“存储不超过 100 000 行并删除其他行”),而是对数据库引擎的提示,该表将具有至少 100 000 行。

我认为解决问题的唯一可能方法是使用BEFORE INSERT触发器,它将检查表中的行数并删除较旧的行。 但我很确定这是一个巨大的过热:/

另一种解决方案是每 N 分钟用 cron 脚本清除表。 这是一种最简单的方法,但它仍然需要另一个系统来监视。

有人知道更好的解决方案吗? :)

尝试限制向表中添加新记录。 当要添加新记录时引发错误。

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 ;

请注意, COUNT 操作在大型 InnoDb 表上可能会很慢。

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

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

没有办法限制 MySQL 中表行的最大数量,除非你编写一个触发器来做到这一点。

我只是在脑子里编造一个答案。 我的假设是你想要一个像“桶”这样的东西,你可以在其中放入记录,并且你想在它达到某个记录数之前清空它。

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

否则你不能在 mysql 中有一个“封顶”表,因为你必须有预定义的操作(我们不允许记录,我们是否截断表?等)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM