【问题标题】:How can I set a maximum number of rows in MySQL table?如何设置 MySQL 表中的最大行数?
【发布时间】:2020-10-06 03:38:37
【问题描述】:

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

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

【问题讨论】:

    标签: mysql triggers


    【解决方案1】:

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

    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 语句来引发错误。

    【讨论】:

    • 我会将您的答案标记为正确,因为它是最有趣的答案。谢谢!
    【解决方案2】:
    • 创建一个包含 100,000 行的表。
    • 在其中一个字段中预填一个 过去的“时间戳”。
    • 选择最旧的记录,更新“时间戳” “创建”(更新)记录时。
    • 仅使用 select 和 update - 从不使用 insert 或 delete。
    • “时间戳”字段的反向索引使 快速选择/更新。

    【讨论】:

    • 当达到上限时,这似乎比插入和截断表要多得多。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      在插入语句之后,运行SELECT LAST_INSERT_ID();,它将自动增加记录 ID。是的,您仍然需要运行额外的查询,但它会占用较低的资源。达到特定计数后,截断表格重置自动增量 ID

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

      【讨论】:

      • 截断删除表中的所有行,而不是将其连接到 N 行:/
      • 对……我误会了吗?我以为你想在达到限制时“清空”桌子?没有?
      • 不,我需要从表中删除过时(旧)行,而不是全部:)
      猜你喜欢
      • 2017-10-31
      • 2010-09-29
      • 2014-11-22
      • 2014-07-21
      • 2022-11-30
      • 1970-01-01
      • 2013-08-13
      • 2013-08-17
      • 1970-01-01
      相关资源
      最近更新 更多