【发布时间】:2019-02-01 07:17:08
【问题描述】:
对于学校作业,我需要一个包含 80 到 100 行(含)的 MySQL 表。一个 cron 作业每 2 小时在表中输入一行。我想用触发器来做到这一点,但显然这是不可能的,因为表由于 INSERT 语句而被锁定。这是我使用的触发器:
CREATE TRIGGER too_many_rows
BEFORE INSERT ON log
FOR EACH ROW
BEGIN
IF (SELECT COUNT(id) FROM log) >= 100 THEN
DELETE FROM log LIMIT 1;
END IF;
END
棘手的部分是表上还有手动插入,这就是我不能定期检查(CRON 作业或 MySQL 事件)是否有太多表的原因,因为在某些时候可能太多了行。理想的情况是每次添加新行时删除最旧的行。
我还有什么办法可以做到这一点吗?
【问题讨论】:
-
您可以控制插入吗?如果是这样,您可以告诉您的 cron 作业更新(覆盖除 id 之外的所有内容)最旧的条目(使用时间戳字段)。
-
为什么没有100行的表,然后只执行UPDATES?
-
我无法控制定期更新。它是来自特定 IP 地址的特定用户,只有 INSERT 和 SELECT 权限。它每 2 小时发出一次 INSERT。
-
是否可以使用触发器阻止 INSERT,并改为更新最旧的条目?
-
您确定您正确理解了任务(或者没有遗漏重要的细节)?它可能是例如一个“应该”,你只需要运行一个 cronjob 来清理。 “必须”通常意味着如果不满足约束,数据将变为无效(如外键或唯一键)。行数在数据模型中是否有任何逻辑意义?查询是否中断?对只有插入/选择权限的日志表强制执行随机行限制(并且不能跳过插入?)听起来,即使可行,就像您只会学习如何不设计数据库(尤其是在练习中)。