gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:48:24 24 4
gpt4 key购买 nike

当我删除一个影响行时,我想将受到影响的星星标记为需要重新计算(重新计算的成本适中,因此推迟到以后,我不想重新计算不需要的星星) .所以我有一个触发器:

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 语句中更改某些内容来完成此操作吗?

最佳答案

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

  • stationinfluence 中创建字段 range 以从删除查询中消除 star 表。例如

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

    此选项需要在插入到 stationinfluence 时创建触发器,以根据带有 star_id 的星计算 range;如果 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);

关于影响用于查询的表的mysql删除触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28890602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com