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

我有这个触发器。如果传入日志与输入过滤器一致,则不保存到数据库中。但是,我想保留每个Primitive_filter的“点击次数”。我有一个名为hit_rate的列,它是int(30)。有什么办法如何做到这一点?也许具体的错误?还是别的? Thx寻求帮助。mysql触发器" title="mysql触发器">mysql触发器从数据库中选择并更新列

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;

前一个条件计算出个性化......它必须读查询返回的所有行
如果查询返回了十亿行,它必须全部读取 - >因为您询问give me a count of rows
然后,在查询返回计数后,有一个检查:如果查询返回至少一行,那么做一些事情。



当查询返回第一行时,后一个条件停止执行查询,节省时间和资源。

以上是 mysql触发器从数据库中选择并更新列 的全部内容, 来源链接: utcz.com/qa/263187.html

回到顶部