数据库触发器-当更新的行中的字段等于三个值之一时,更新另一个表

时间:2018-09-22 15:13:48

标签: mysql sql triggers

我在为mysql编写数据库触发器时遇到麻烦。为简单起见,我将布置一个伪造的架构,然后告诉您触发器应该做什么:

Table A
id
status
base_id

Table B
id
status
A.base_id (foriegn key back to base_id)

在更新表A中的记录时,如果状态设置为三个值(4、5、6)之一,则触发器需要更新表B中与base_id匹配的所有记录。

这个问题要比这棘手得多,但这是问题的根源,我是数据库触发器的新手,而且似乎还无法解决。这些表非常大,因此需要“定位”触发器。换句话说,它不应在每次更新时都扫描整个表A,并相应地更新表B中的所有记录。它应该只更新表B中与触发触发器的单个更新行直接对应的记录。

任何帮助将不胜感激。

################### 33更新

这是当前的触发器,但是无法编译。错误是““新”中的未知列“状态””

DELIMITER $$
CREATE TRIGGER db.after_tableA_update
AFTER UPDATE ON tableA
FOR EACH ROW

BEGIN

IF NEW.status IN (13,14,15) then
     update tableB as b set b.task_status = 26 where b.match_id = NEW.match_id;
END IF;
END $$
DELIMITER ;

1 个答案:

答案 0 :(得分:1)

这很简单,如果我理解您的正确的话。触发器的主体应与此类似:

setTimeout(this.functionName,1000)

但是,如果您只想在状态从另一个值设置为4,5,6时进行更新(还可以防止不必要的查询),则应将if语句更改为此:

axios.get('blablabla').then(response=>{//put the response into vue dataArrayName in data part});

只要您在表B的v-for="dataArrayName"列上有索引并且有足够的内存来覆盖它,此更新查询将非常快速地工作。

注意:如果可以在应用程序代码中执行此操作,则应避免使用触发器。即使您在内部做一些非常简单的操作,mysql中的触发器也会大大降低性能。如果此表不经常更新,则没关系。