当我删除影响行时,我想标记受影响的星星它需要重新计算(重新计算是适度昂贵的,所以推迟到以后,我不想重新计算不需要的星) 。所以我有一个触发器:
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
语句中更改以完成此操作?
答案 0 :(得分:0)
除了通过单独的查询获取ID之外,我还看到了另外两个选项:
在range
中创建字段stationinfluence
,以从删除查询中删除star
表。 e.g。
DELETE FROM stationinfluence WHERE stationinfluence.station_id = 12024 and range>300
此选项需要在插入stationinfluence
时创建触发器,以range
计算star_id
星座的基数;如果更改了x
,y
,则会触发星号表上的更新;等等...
将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);