gpt4 book ai didi

MySQL:如何使用触发器进行多次更新或条件更新

转载 作者:行者123 更新时间:2023-11-30 00:32:25 26 4
gpt4 key购买 nike

我有一个表记录我们所有的用户和客户端信息(sessionEvent)。它记录页面 View 、登录、电子邮件 View 等内容。这些不同的类型由类型的外键指定。我的 sessionEvent 表的表结构如下所示:

--------------------------------------------------------------------------
| typeID | userID | clientID | emailID |
--------------------------------------------------------------------------
| 1 | 12345 | 12 | NULL |
--------------------------------------------------------------------------
| 2 | 54321 | 5 | NULL |
--------------------------------------------------------------------------
| 3 | 78945 | 4 | 5555 |
--------------------------------------------------------------------------

此表中的所有列都是外键,假设类型如下:

  • 类型 ID 1 = 登录
  • typeID 2 = 页面浏览量
  • typeID 3 = 电子邮件 View

每次我们的应用程序中发生事件时,都会将一条记录添加到此 sessionEvent 表中。目前此表中有 1 亿行,因此访问此表获取摘要报告数据的效率有点低。

我正在尝试使用触发器来增加相应相关表中的汇总字段。我的这次尝试取得了部分成功,但在对适当的表进行条件更新时遇到了麻烦。例如,这是我在 sessionEvent 表上插入后的当前触发器:

UPDATE client, user
SET
client.clientLogins = client.clientLogins + 1,
user.userLogins = user.userLogins + 1,
WHERE
client.clientID = new.clientID
AND user.userID = new.userID
AND new.typeID = 1

当插入 typeID = 1 的记录时,这可以工作并增加客户端和用户表各自的登录字段。现在我开始陷入困境的是,我似乎无法在其中添加多个更新查询单个触发器。

因此,如果查看电子邮件,则会将一条记录添加到此 sessionEvent 表中,其 typeID = 3。我想使用相同的触发器来更新电子邮件表中 View 的摘要字段。我已经探索了一些案例陈述,但似乎找不到正确的解决方案。基本上,这就是我想要完成的任务:

将记录添加到 sessionEvent 表时,触发器会根据类型对某些表中的某些字段运行更新。我知道这个语法是错误的,但大致上是这样的。

if typeID = 1 then update user, client
set user.userLogins = user.userLogins + 1,
client.clientLogins = client.clientLogins + 1

if typeID = 3 then update email
set views = views + 1

预先感谢您的帮助。

这是我想要运行的示例触发代码

这是我想要运行的触发器的示例:

UPDATE client, user
SET
client.clientLogins = client.clientLogins + 1,
user.userLogins = user.userLogins + 1,
WHERE
client.clientID = new.clientID
AND user.userID = new.userID
AND new.typeID = 1;

UPDATE email
SET
emailViews = emailViews + 1
WHERE
email.emailID = new.emailID
AND new.typeID = 3;

完全触发DDL:

CREATE TRIGGER
after_sessionEvent_insert after insert ON sessionEvent
FOR EACH ROW BEGIN
UPDATE client, user
SET client.clientLogins = client.clientLogins + 1,
user.userLogins = user.userLogins + 1
WHERE client.clientID = new.clientID
AND user.userID = new.userID
AND new.sessionEventTypeID = 1;
UPDATE email
SET emailViews = emailViews + 1
WHERE emailID = new.emailID
AND new.sessionEventTypeID = 3;
END;

最佳答案

实际上,您可以在同一触发器内执行各种 dml。您应该发布完整的触发代码,以便我们进行调查。

还要确保触发器不会导致无限循环,例如更新表 a 触发器插入表 b,以及插入 tabke b 会导致表更新。

关于MySQL:如何使用触发器进行多次更新或条件更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22413207/

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