将mysql表的插入限制为n行

hsgswve4  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(361)

我在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;
rslzwgfq

rslzwgfq1#

可以使用存储过程代替常规的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);
1wnzp6jl

1wnzp6jl2#

在下面的屏幕中显示显示程序状态的结果
屏幕1

相关问题