簡體   English   中英

MySQL:如何使用觸發器進行多次更新或條件更新

[英]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                  |
--------------------------------------------------------------------------

該表中的所有列都是外鍵,對於這些類型假定以下條件:

  • 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;

實際上,您可以在同一觸發器中執行各種dml。 您應該發布完整的觸發代碼,以便我們進行調查。

還要確保您不會對觸發器造成無限循環,例如在表b上插入觸發器,在表b上進行更新,在表b中插入在表b中引起的更新。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM