婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL觸發器的使用

MySQL觸發器的使用

熱門標簽:400電話變更申請 催天下外呼系統 html地圖標注并導航 400電話辦理服務價格最實惠 北京金倫外呼系統 南太平洋地圖標注 大豐地圖標注app 武漢電銷機器人電話 呂梁外呼系統

觸發器可以在執行語句前或執行后觸發其他 SQL 代碼運行。觸發器可以讀取觸發語句改變了哪些數據,但是沒有返回值。因此可以使用觸發器加強業務邏輯的約束而不需要在應用程序寫對應的代碼。

從上述描述可以看到,觸發器可以簡化應用程序的邏輯并且可以提升性能,這是因為使用觸發器減少了應用程序和服務端的交互次數。同時,觸發器有助于完成自動更新歸一化和統計數據。例如,我們可以使用觸發器自動統計交易訂單總金額,訂單數及平均客單價。 然而,MySQL 的觸發器的應用場合也十分有限,如果你使用過其他數據庫產品的觸發器,不要以為 MySQL 也能實現相同的功能,例如:

  • 每個數據表的單一事件只能有一個觸發器,也就是說對于 AFTER INSERT 這樣的事件來說,不能同時有超過1個的觸發器。
  • MySQL 只支持行級別的觸發器,也就是只能按 FOR EACH ROW 這種方式使用觸發而不是整個 SQL 語句,這對于大量數據的操作而言會比較低效。MySQL 的觸發器只能按下面的形式編寫:
CREATE TRIGGER 觸發器名 BEFORE|AFTER 觸發事件
ON 表名 FOR EACH ROW
BEGIN
    執行語句列表;
END

執行語句列表支持單條或多條語句,下面是一個多條語句的示例:

DELIMITER $$
CREATE TRIGGER user_create_log AFTER INSERT ON t_users FOR EACH ROW
BEGIN
DECLARE log_info VARCHAR(40)character set utf8;
DECLARE description VARCHAR(20) character set utf8;#后面發現中文字符編碼出現亂碼,這里設置字符集
SET description = " is created";
SET log_info = CONCAT(NEW.user_name, description);     #函數CONCAT可以將字符串連接
INSERT INTO logs(log) values(log_info);
END $$

DELIMITER ;
  • 觸發器可能導致服務端實際執行的工作不可預測,一個簡單的語句可能導致服務端做大量不可見的工作。例如,如果一個觸發器更新了 一個相關的表,可能導致受影響的行數加倍。
  • 觸發器難以調試,并且一旦引入了觸發器,很難分析性能瓶頸。
  • 觸發器會導致潛在的鎖等待和死鎖。如果觸發器失敗了,源查詢也會失敗。如果沒有意識到觸發器的存在,這類玩呢提很難發現。

大多數限制中,最大的限制是 FOR EACH ROW 的設計,這有時候導致觸發器沒法用于維護統計和緩存表,這是因為這可能很慢。使用觸發器的主要理由是相比定時同步更新,觸發器可以一致保持數據的一致性。 觸發器也沒法保證原子性。例如,更新 MyISAM 數據表的觸發器在源 SQL 語句出錯后,無法回滾。而且,觸發器自身也可能都只錯誤。如果我們使用了 AFTER UPDATE 基于 MyISAM 數據表去更新另一個表。如果觸發器有個導致第二張表操作失敗的錯誤,那對于第一張表的操作不會回滾。

InnoDB 的觸發器相關的操作,包括源語句都在同一個事務中,因此是滿足原子性的。然而,如果使用InnoDB 的觸發器去與另一張表校驗數據一致性的時候,這個時候如果不小心的話可能導致不正確的結果。例如,假設需要使用觸發器模擬外鍵,可以使用 BEFORE INSERT觸發器驗證另一張表是否存在對應的記錄,但是如果在觸發器讀取另一張表數據的時候不使用 SELECT FOR UPDATE的話,則由于并發性性問題可能導致錯誤的結果。 雖然觸發器有些缺陷,但是這并不意味著不能用。相反,觸發器本身也是有用的,尤其是對于約束,系統維護任務和保持統計數據保持最新。

也可以使用觸發器記錄數據行的變化。這樣即便是離線手動操作數據庫的記錄(如修復錯誤數據)也能夠被記錄下來。但是,需要注意的是對于往其他自增主鍵表插入數據時要小心,這對于復制性的語句表現會有問題,因為自增值對于兩個相同的副本值并不同。

結語:

觸發器在有限的場合能夠發揮其優勢,比如統計數據、數據表變更日志等。但是也會有一些缺陷,比如大數據量的更新由于逐行觸發,會降低效率。還有就是,MyISAM 引擎無法保障原子性。因此,要根據應用場景是否要是有觸發器。

以上就是MySQL觸發器的使用的詳細內容,更多關于MySQL觸發器的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • Mysql觸發器在PHP項目中用來做信息備份、恢復和清空
  • 一篇文章帶你深入了解Mysql觸發器
  • 詳解MySQL數據庫之觸發器
  • mysql 觸發器語法與應用示例
  • MySql視圖觸發器存儲過程詳解
  • mysql觸發器實時檢測一條語句進行備份刪除思路詳解

標簽:西寧 徐州 龍巖 南充 自貢 麗水 無錫 迪慶

巨人網絡通訊聲明:本文標題《MySQL觸發器的使用》,本文關鍵詞  MySQL,觸發器,的,使用,MySQL,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL觸發器的使用》相關的同類信息!
  • 本頁收集關于MySQL觸發器的使用的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 辛集市| 长宁县| 襄汾县| 绥中县| 瑞昌市| 阿城市| 瓮安县| 卢氏县| 乡宁县| 阿克陶县| 凌云县| 瑞昌市| 准格尔旗| 焉耆| 五指山市| 蒲江县| 建宁县| 航空| 永川市| 会泽县| 江阴市| 新源县| 军事| 葵青区| 宜良县| 扶沟县| 神农架林区| 叙永县| 邳州市| 广南县| 安义县| 大丰市| 荃湾区| 安平县| 房山区| 屏边| 曲松县| 库车县| 上虞市| 无为县| 柏乡县|