【问题标题】:MySQL: How to use triggers to make multiple updates or conditional updatesMySQL:如何使用触发器进行多次更新或条件更新
【发布时间】:2014-03-15 04:01:13
【问题描述】:

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

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

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

  • typeID 1 = 登录
  • typeID 2 = 页面浏览量
  • typeID 3 = 电子邮件视图

每次在我们的应用程序中发生事件时,都会将一条记录添加到此 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 插入记录时,这将起作用并增加客户端和用户表的相应登录字段。现在我开始陷入困境的是我似乎无法在其中添加多个更新查询一个触发器。

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

将记录添加到 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;

【问题讨论】:

    标签: mysql database


    【解决方案1】:

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

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

    【讨论】:

    • 请建立完整的触发器 DDL
    • 刚刚为触发器添加了完整的 DDL。
    • 我得到的错误是在两个更新之间的行
    • 我是个白痴。我没有使用分隔符。新手错误,但感谢您帮助我解决问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多