Mysql

如果記錄存在,MySQL 觸發更新鍵

  • July 23, 2017

我正在嘗試在 MariaDB 中建構一個觸發器來遵循這個邏輯:

1. If the primary key val exists, increment the counter column
2. Else, insert the primary key into the table

這是我的散文觸發器:

delimiter //
CREATE TRIGGER volume_manager BEFORE INSERT ON individual_key_log
   FOR EACH ROW
   BEGIN
       IF NEW.reference_key not in (
           select *
           From individual_key_log
           where (NEW.reference_key = 'test')
       ) THEN -- MISSING THEN
          CALL `Insert not allowed`;
       END IF;
   END;
//
delimiter ; 

為什麼要為此編寫觸發器?我有兩個理由說明你在這種情況下不應該這樣做。

原因 #1

讓我們假設以下內容:

  • reference_key
    • 不是 auto_increment 列
    • 是主鍵
  • counter
    • 是要增加的列
    • 定義為INT NOT NULL DEFAULT 1

您可以按如下方式編寫 INSERT

INSERT INTO individual_key_log (reference_key,...)
VALUES (...) ON DUPLICATE KEY UPDATE counter = counter + 1;

這是比觸發器更清潔的方法

原因 #2

我注意到你的觸發器中間有一個 CALL。相信我,除非有必要,否則您不想觸發中斷中游的觸發器。在觸發器中呼叫任何東西都需要成本,並且會影響查詢性能。我寫過這個Jan 13, 2012從觸發器呼叫儲存過程

我還寫了關於如果沒有正確完成觸發器如何停止正常操作的文章:請參閱我的文章Apr 25, 2011MySQL 中的觸發器以防止插入,其中我展示瞭如何暫停觸發器以防止插入檢查單獨的表。

你必須使用iNSERT ... ON DUPLICATE KEY語義:

INSERT INTO individual_key_log (reference_key,...) 
      VALUES (...)
   ON DUPLICATE KEY UPDATE counter=counter+1;

引用自:https://dba.stackexchange.com/questions/139751