【问题标题】:MySQL trigger on insert of text going into infinite loopMySQL在插入文本时触发进入无限循环
【发布时间】:2017-12-05 07:47:11
【问题描述】:

共有三个表:users、ap_name_bank_m 和 ap_name_bank_h。 users 表包含三列“name_eng”(用户英文名)、“name_gdn_eng”(用户监护人英文名)和“类别”。

ap_name_bank_m 和 ap_name_bank_h 是每个名称类别的名称语料库:“m”或“h”。

当一行更新时,我想检查两个名称的每个单词是否存在于两个表 ap_name_bank_m 和 ap_name_bank_h 中。

将分配该类别的计数较高的那个。我编写的以下代码进入无限循环,我收到“MySQL 服务器已消失错误”。谁能告诉我哪里错了?

假设 name_eng 和 name_gdn_eng 将只包含带空格的单词,没有其他内容。

DELIMITER $$
create trigger set_cat before update on users_table for each row
BEGIN
declare words text;
declare word varchar(50);
declare num_m int default 0;
declare num_h int default 0;
declare len int default 0;

set words = concat(new.name_eng,' ',new.name_gdn_eng);

iterator:
LOOP
set word = substring_index(words,' ',1);
set num_m = EXISTS(select 1 from ap_name_bank_m where name=word) + num_m;
set num_h = EXISTS(select 1 from ap_name_bank_h where name=word) + num_h;

set words = trim(replace(words,word,''));
END LOOP iterator;

if (num_m > num_h) then set new.category='M'; end if;
if (num_h > num_m) then set new.category='H'; end if;
END $$
DELIMITER ;

【问题讨论】:

  • 循环为什么要终止
  • @P.Salmon 知道了。那么如何从循环中删除单词呢?
  • words为空或null时退出循环。

标签: mysql loops triggers


【解决方案1】:

我找到了一个更好的方法来做到这一点。不需要循环。

BEGIN
declare words text;
declare word varchar(50);
declare num_m int default 0;
declare num_h int default 0;

set words = concat(new.name_eng,' ',new.name_gdn_eng);

set num_h = (select count(*) from ap_name_bank_h where match(name) against (words in natural language mode));

set num_m = (select count(*) from ap_name_bank_m where match(name) against(words in natural language mode));

/*
iterator:
LOOP
set word = substring_index(words,' ',1);
set num_m = EXISTS(select 1 from ap_name_bank_m where name=word) + num_m;
set num_h = EXISTS(select 1 from ap_name_bank_h where name=word) + num_h;

set words = trim(replace(words,word,''));
END LOOP iterator;*/

if (num_m > num_h) then set new.category='M'; end if;
if (num_h > num_m) then set new.category='H'; end if;
END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2011-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多