简体   繁体   English

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

[英]mysql trigger with select from database and update a column

I have this trigger. 我有这个触发器。 If the incoming log agrees with input filter, than is not saved into database. 如果输入的日志与输入过滤器一致,则不会保存到数据库中。 But, I want to keep number of "hits" of each Primitive_filter. 但是,我想保留每个Primitive_filter的“点击数”。 I have a column named hit_rate, which is int(30). 我有一个名为hit_rate的列,它是int(30)。 Is there some way how to do that? 有什么办法可以做到吗? Maybe specific error? 也许是特定的错误? Or sth else? 还是其他? Thx for help. 谢谢。

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

trigger 触发

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 ;

This is NOT the answer to your question. 这不是您问题的答案。

It's only a hint how to fix a potentially serious performance problem in your code. 这仅是如何解决代码中潜在的严重性能问题的提示。

Don't use this: 不要使用此:

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

Use this instead: 使用此代替:

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

The former condition calculates a count ... it must read all rows returned by the query 前一个条件计算一个计数...它必须读取查询返回的所有行
If the query returns billion rows, it must reads them all --> because you asked give me a count of rows . 如果查询返回十亿行,它必须全部读取->因为您要求give me a count of rows
Then, after the query return the count, there is a check: if the query returns at least one row , then do something. 然后,在查询返回计数之后,进行检查:如果查询返回至少一行 ,则执行某些操作。



The latter condition stops executing the query when the query returns first row, saving time and resources. 当查询返回第一行时,后一种情况将停止执行查询,从而节省了时间和资源。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM