【发布时间】: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;
【问题讨论】: