mysql删除触发器影响用于查询的表

时间:2015-03-06 00:51:49

标签: mysql triggers

当我删除影响行时,我想标记受影响的星星它需要重新计算(重新计算是适度昂贵的,所以推迟到以后,我不想重新计算不需要的星) 。所以我有一个触发器:

CREATE TRIGGER stationinfluence_cleanup after delete ON stationinfluence
  FOR EACH ROW BEGIN
    UPDATE star s SET s.needs_recalc = 1 WHERE s.id = OLD.star_id;
END //

如果我知道需要删除哪些stationinfluence行,这可以正常工作:

mysql> delete from stationinfluence where stationinfluence.station_id = 12024 and star_id in (1);
Query OK, 1 row affected (0.01 sec)

但是如果我不知道并且想要计算它们(它们是从目前可能受影响的中心点范围之外的任何星星,如果有帮助的话),mySQL会出错:

mysql> delete from stationinfluence where stationinfluence.station_id = 12024 and exists (select 1 from star where star.id = `stationinfluence`.`star_id` and pow(pow(star.x - -6,2)+pow(star.y-5,2),0.5) > 300);
ERROR 1442 (HY000): Can't update table 'star' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

查询我需要删除然后删除它们的ID并不是世界末日,但这是对数据库的额外往返,我宁愿避免。

我是否可以在触发器或delete语句中更改以完成此操作?

1 个答案:

答案 0 :(得分:0)

除了通过单独的查询获取ID之外,我还看到了另外两个选项:

  • range中创建字段stationinfluence,以从删除查询中删除star表。 e.g。

    DELETE FROM stationinfluence WHERE stationinfluence.station_id = 12024 and range>300
    

    此选项需要在插入stationinfluence时创建触发器,以range计算star_id星座的基数;如果更改了xy,则会触发星号表上的更新;等等...

  • needs_recalc存储在单独的表中,并存储在触发器中:

    UPDATE star_recalc s SET s.needs_recalc = 1 WHERE s.id = OLD.star_id;
    

    或更好(star_recalc类似日志表,只需在重新计算后插入和删除,可能是唯一的star_id):

    INSERT into star_recalc (star_id) values(OLD.star_id);