从数据库中选择并更新列的mysql触发器

标签 mysql triggers sql-update

我有这个触发器。如果传入日志与输入过滤器一致,则不会保存到数据库中。但是,我想保留每个 Primitive_filter 的“命中”次数。我有一个名为 hit_rate 的列,它是 int(30)。有什么办法吗?也许具体错误?或者别的什么?感谢您的帮助。

UPDATE Primitive_filters SET hit_rate = hit_rate + 1 where Primitive_filters.id = ???;

触发器

delimiter //
CREATE TRIGGER inputFilter
before insert
on Logs
for each row
begin
declare msg varchar(255);
IF (SELECT COUNT(*) FROM Primitive_filters, Primitive_in_filter, Filters WHERE 
Filters.name = "input" AND Filters.id = Primitive_in_filter.id_filter AND Primitive_in_filter.id_primitive = Primitive_filters.id AND
(Primitive_filters.id_host LIKE CONCAT('%',(SELECT host FROM Hosts WHERE id = new.id_host),'%') OR Primitive_filters.id_host IS NULL) AND
(Primitive_filters.facility LIKE CONCAT('%',new.facility,'%') OR Primitive_filters.facility IS NULL) AND
(Primitive_filters.priority LIKE CONCAT('%',new.priority,'%') OR Primitive_filters.priority IS NULL) AND
(Primitive_filters.program LIKE CONCAT('%',new.program,'%') OR Primitive_filters.program IS NULL) AND
(new.msg REGEXP Primitive_filters.msg OR Primitive_filters.msg IS NULL)) > 0 THEN CALL raise_error; END IF; 
END //

delimiter ;

最佳答案

这不是您问题的答案。

这只是一个提示,说明如何解决代码中潜在的严重性能问题。

不要使用这个:

IF (SELECT COUNT(*) FROM ... giant query ...) > 0 
THEN CALL raise_error; 
END IF; 

改用这个:

IF EXISTS (SELECT 1 FROM ... giant query ...)
THEN CALL raise_error; 
END IF; 

前一个条件计算一个计数...它必须读取查询返回的所有行
如果查询返回十亿行,它必须读取所有行 --> 因为你要求给我一个行数
然后,在查询返回计数后,进行检查:如果查询返回至少一行,则执行某些操作。



后一种情况在查询返回第一行时停止执行查询,从而节省时间和资源。

关于从数据库中选择并更新列的mysql触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19436707/

相关文章:

php - MySQL 如何使用 php 存储多个变量(字符串和/或 int)?

php - 如何显示mysql联合查询的结果

mysql - 如何为我的 MySql 表列之一生成唯一的随机字符串?

mysql - MySQL一次更新多条记录的方法

php mysql在数据库的文本区域中存储换行符

mysql - 如何安全地查找Linux服务器上的所有mysql数据库

mysql - 只有在 MySQL 上不存在时才创建触发器

sql-server - 在迁移到 Azure DB 期间如何处理 SQL Server 数据库上的触发器?

MySQL - 插入触发器后不运行更新查询?

mysql - 如何使用 sqlalchemy 更新 mysql 表中的列?