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

时间:2014-03-14 18:40:57

标签: mysql database

我有一个记录所有用户和客户端信息的表(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的记录时,这可以为客户端和用户表增加相应的登录字段。现在我开始陷入困境的是我似乎无法在其中添加多个更新查询一个触发器。

因此,如果查看了电子邮件,则会在typeManager = 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;

1 个答案:

答案 0 :(得分:0)

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

另外,请确保不要使用触发器导致无限循环,例如在表b中更新触发器插入表,并在tabke b中插入会导致表更新。