【问题标题】:Trigger when tresshold is passed (MySQL)超过阈值时触发(MySQL)
【发布时间】:2011-10-13 12:22:21
【问题描述】:

我有一张带有序列号(主键)、文本、日期的表格

每隔一段时间就会插​​入一行。

我遇到的问题是我的表可能包含的行数不能少于 80 行且不超过 100。

我试着写点东西,但似乎我在做我不应该做的事情:

CREATE TRIGGER checkForInsertBelow80 BEFORE INSERT ON log FOR EACH ROW 
BEGIN
  IF (SELECT count(*) FROM log) >= 100 THEN
    DELETE FROM log 
      WHERE serial in(SELECT serial from log order by serial ASC limit 10);
  END IF      
END; |

但首先我有语法错误,其次,我应该在最后一行之后执行此操作。

有人可以帮我把正确的方法和代码放在一起吗?

【问题讨论】:

    标签: mysql database stored-procedures


    【解决方案1】:

    1- 存储过程中的每个语句都必须以; 结束。

    2- 可以简化删除语句。

    3- 但是,您不能在触发器内更改同一个表,您只能更改触发器内的其他表。

    解决方案

    使用黑洞表并插入其中,黑洞将您的数据插入日志表,或在需要时删除日志条目。

    CREATE TABLE bh_log (
      id integer null default null,
      field1 varchar(255) not null,
      other fields....
    ) ENGINE = BLACKHOLE;
    

    现在根据需要向黑洞表添加触发器。

    您需要一个 INSERT 触发器,UPDATES 和 DELETES 是在原始日志表上完成的。

    DELIMITER $$
    
    CREATE TRIGGER ai_bh_log_each AFTER INSERT ON bh_log FOR EACH ROW
    BEGIN
      DECLARE log_count INTEGER;
      INSERT INTO log VALUES (NEW.id, NEW.field1, NEW......);
      SELECT count(*) INTO log_count FROM log;
      IF log_count > 100 THEN 
        //Delete the oldest entry
        DELETE FROM log WHERE log.id IS NOT NULL ORDER BY id ASC LIMIT 1; 
      END IF;
    END $$
    
    DELIMITER ;
    

    由于触发器会针对您插入的每一行触发,因此您只需在每个触发器中删除 1 行即可 100% 使总行数永远不会超过 100。

    【讨论】:

      猜你喜欢
      • 2020-04-10
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-19
      • 1970-01-01
      相关资源
      最近更新 更多