MySQL触发器:更新一张表中的记录,其中同一行中的记录匹配选择查询

Posted

技术标签:

【中文标题】MySQL触发器:更新一张表中的记录,其中同一行中的记录匹配选择查询【英文标题】:MySQL Trigger: update record in one table where record in the same row match select query 【发布时间】:2020-05-02 11:21:49 【问题描述】:

mysql 和数据库不熟悉,需要一些帮助。 我有桌子:

约会

appointment_id int PK , patient_id int , 医生 ID 整数, appointment_time 日期时间。

队列

appointment_id int PK, actual_time 日期时间。

queue_summary

日期日期时间, doctor_id int PK , num_of_patients int。

我需要编写一个触发器来更新 num_of_patients,方法是在 queue_summary 中的医生 ID 与插入到 queue 中与预约对应的新行重叠的行中的记录中添加 +1(提取医生 ID)。

例如。如果插入到queue:

约会表状态:

需要更新:

我编写了以下选择查询来提取受插入/删除影响的医生id到队列:

 select appointment.doctor_id
            from appointment as a 
            join queue as q 
            on a.appointment_id = q.appointment_id
            where new.appointment_id = a.appointment_id;

我尝试按如下方式编写触发器:

delimiter // 

CREATE TRIGGER tr_insert 
    BEFORE INSERT ON queue
    FOR EACH ROW
        BEGIN

          set queue_summary.num_of_patients = queue_summary.num_of_patients+1
          where queue_summary.doctor_id = (
          select appointment.doctor_id
            from appointment as a 
            join queue as q 
            on a.appointment_id = q.appointment_id
            where new.appointment_id = a.appointment_id
        )
       END;//
 delimiter ;

但是没有运气... 我知道我在 where 部分有一些语法错误,但我无法让它工作...... 请指教, 提前致谢!

【问题讨论】:

【参考方案1】:

触发器中的 SET 命令只能用于 NEW var,它指向正在处理的行。要更新另一个表,您需要发出普通的 UPDATE 命令:

delimiter // 

CREATE TRIGGER tr_insert 
    BEFORE INSERT ON queue
    FOR EACH ROW
        BEGIN

          update queue_summary
          set queue_summary.num_of_patients = queue_summary.num_of_patients+1
          where queue_summary.doctor_id = (
          select appointment.doctor_id
            from appointment as a 
            join queue as q 
            on a.appointment_id = q.appointment_id
            where new.appointment_id = a.appointment_id
        )
       END;//
 delimiter ;

这就是为什么在 where 出现语法错误的原因,这是因为 mysql set 命令不会期望它在那里,SET 只接受 var name 和 value。

【讨论】:

以上是关于MySQL触发器:更新一张表中的记录,其中同一行中的记录匹配选择查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL如何更新另一个表中同一行的多个列

想写一个DB2触发器,几张表有关联,修改其中一张主表中的某一个字段,其他关联表中的该字段也跟着联动修改

如何定时更新mysql一张表中的某个字段

MySql 触发器删除同一张表中的子记录

触发器-当一个表更新时,将数据插入另一张表中

MySQL如何创建一个触发器,功能是在一张表中insert一条数据,另一张表中的数据相应地进行update。