在触发器中加入更新命令

Posted

技术标签:

【中文标题】在触发器中加入更新命令【英文标题】:join in update command in trigger 【发布时间】:2012-11-06 11:30:31 【问题描述】:

我有 3 个表,tbl_image、tbl_vehicle_image 和 tbl_vehicle

tbl_vehicle_image 解决了 tbl_image 和 tbl_vehicle 之间的多对多关系

tbl_vehicle 有一个 last_modified_date

如何创建一个触发器,当我更改例如 tbl_image.img_lnk 时,使用 tbl_vehicle_image 来查找 tbl_vehicle 中使用该图像的所有记录,并将它们的 last_modified_date 设置为 NOW()?

【问题讨论】:

【参考方案1】:

你可以这样做:

DELIMITER $$;

create TRIGGER UpdateLastmodifiedDate AFTER UPDATE ON tbl_image
FOR EACH ROW 
BEGIN
   UPDATE tbl_vehicle v
   INNER JOIN tbl_vehicle_image vi ON v.vehicleId = vi.vehicleID
   INNER JOIN tbl_image i ON vi.imageid = i.id
   SET v.lastmodified_date = NOW()
   WHERE i.img_lnk = NEW.img_lnk;
END$$

【讨论】:

我会发布她的,因为它正在讨论这个答案,我在顶部添加了 DELIMITER $$ 并在最后一行添加了一个分号(WHERE i.....)并且语法问题消失了【参考方案2】:
CREATE TRIGGER `trig_after_image_update` AFTER UPDATE ON `tbl_image`
 FOR EACH ROW 
    if old.img_lnk<>NEW.img_lnk
    then
        update tbl_vehicle  set last_modified_date=NOW() where id in (select vehicle_id from tbl_vehicle_image where image_id=OLD.id);
    end if;

我没有您表的所有字段名称,因此请更改它们。我已经使用 id 作为对应表的主键。

【讨论】:

对于这两个答案,我都得到“语法错误,意外结束” @KellyLarsen - 尝试使用END$$ 而不是END @KellyLarsen 在起跑线上使用set delimiter $$ 我在集合分隔符 $$ 中的 $$ 下收到“语法错误,意外 IDENT_QUOTED,期待 EQ 或 SET_VAR” 在开始 DELIMITER $$ 时使用它而不是第一个。

以上是关于在触发器中加入更新命令的主要内容,如果未能解决你的问题,请参考以下文章

unity-动画中加入触发事件

java swing中实现列表中加入单选按钮,单选按钮发生变化时能触发事件

SQL Server 存储过程和触发器

是啥触发 Elastic Beanstalk 拉入更新的 Docker 映像

oracle 触发器 pragma autonomous_transaction

通过 vba/sql 在 Access 中加入多个表