【问题标题】:Limit the insertions to MySQL table to N rows将 MySQL 表的插入限制为 N 行
【发布时间】:2019-01-26 09:13:56
【问题描述】:

我在 MySQL 中创建了一个表。

我希望这张表只存储 30 行,当超过 30 行时让我们说是 31 行,那么该表必须删除旧的 30 行。

这在 MySQL 中可行吗?

我使用了以下触发器,但它不适用于我。

CREATE TRIGGER my_name
BEFORE INSERT ON try
FOR EACH ROW
BEGIN
    DECLARE cnt INT;

    SELECT count(*) INTO cnt FROM try;

    IF cnt = 30 THEN
        SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'You can store only 10 records.';
    END IF;
END;

【问题讨论】:

  • 0。创建时间戳列后.., 1. 插入 30 行。 2. 禁止插入。 3. 改用更新
  • OP,请添加您的查询。没有人可以为您调试。
  • 您的代码对我来说很好,也许您只是没有设置分隔符。问题的删除部分发生了什么?
  • @P.Salmon,它如何与您合作,?对于删除部分,我不知道该怎么做。云你帮我让代码只插入30行,超过30行时删除并添加新的。

标签: php mysql sql mysql-workbench


【解决方案1】:

您可以使用存储过程代替常规的 INSERT 语句。存储过程将首先根据输入参数添加行,然后根据需要删除旧行。请看下面的例子。您可能需要根据表的列调整limitedInsert 过程的输入参数。

我的示例表架构

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(1) NOT NULL AUTO_INCREMENT,
  `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `value` tinyint(4) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

程序

DELIMITER //
CREATE DEFINER=`root`@`%` PROCEDURE `limitedInsert`(
    IN `parameter_1` INT
)
BEGIN
    DECLARE rowsNumber INT;
    DECLARE idToRemove INT;

    insert into test(value) values(parameter_1);
    select count(*) into rowsNumber from test;

    if rowsNumber > 30 then
        select id into idToRemove from test order by timestamp asc limit 1;
        delete from test where id = idToRemove;
    end if;
END//
DELIMITER ;

使用存储过程插入数据

call limitedInsert(2);

【讨论】:

    【解决方案2】:

    在以下屏幕中显示 SHOW PROCEDURE STATUS 的结果

    screen1

    【讨论】:

      猜你喜欢
      • 2020-04-17
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多