[英]MySQL: How to use triggers to make multiple updates or conditional updates
我有一個表記錄所有我們的用戶和客戶端信息(sessionEvent)。 它記錄諸如頁面查看,登錄名,電子郵件查看等內容。這些不同類型由外鍵指定類型。 我的sessionEvent表的表結構如下所示:
--------------------------------------------------------------------------
| typeID | userID | clientID | emailID |
--------------------------------------------------------------------------
| 1 | 12345 | 12 | NULL |
--------------------------------------------------------------------------
| 2 | 54321 | 5 | NULL |
--------------------------------------------------------------------------
| 3 | 78945 | 4 | 5555 |
--------------------------------------------------------------------------
該表中的所有列都是外鍵,對於這些類型假定以下條件:
每次在我們的應用程序中發生事件時,都會向該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;
實際上,您可以在同一觸發器中執行各種dml。 您應該發布完整的觸發代碼,以便我們進行調查。
還要確保您不會對觸發器造成無限循環,例如在表b上插入觸發器,在表b上進行更新,在表b中插入在表b中引起的更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.