最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL觸發(fā)器的使用

 更新時間:2021年05月24日 09:46:34   作者:島上碼農(nóng)  
觸發(fā)器用于在 MySQL 執(zhí)行插入、更新或刪除語句時,自動觸發(fā)執(zhí)行其他SQL代碼。本文講解觸發(fā)器的正確使用方式

觸發(fā)器可以在執(zhí)行語句前或執(zhí)行后觸發(fā)其他 SQL 代碼運行。觸發(fā)器可以讀取觸發(fā)語句改變了哪些數(shù)據(jù),但是沒有返回值。因此可以使用觸發(fā)器加強業(yè)務(wù)邏輯的約束而不需要在應(yīng)用程序?qū)憣?yīng)的代碼。

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

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

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

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;#后面發(fā)現(xiàn)中文字符編碼出現(xiàn)亂碼,這里設(shè)置字符集
SET description = " is created";
SET log_info = CONCAT(NEW.user_name, description);     #函數(shù)CONCAT可以將字符串連接
INSERT INTO logs(log) values(log_info);
END $$

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

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

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

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

結(jié)語:

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

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

相關(guān)文章

  • Mysql兩表聯(lián)合查詢的四種情況總結(jié)

    Mysql兩表聯(lián)合查詢的四種情況總結(jié)

    今天小編就為大家分享一篇關(guān)于Mysql兩表聯(lián)合查詢的四種情況總結(jié),小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • MySQL數(shù)據(jù)時區(qū)問題以及datetime和timestamp類型存儲的差異

    MySQL數(shù)據(jù)時區(qū)問題以及datetime和timestamp類型存儲的差異

    這篇文章主要介紹了MySQL數(shù)據(jù)時區(qū)問題以及datetime和timestamp類型存儲的差異,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Django連接本地mysql數(shù)據(jù)庫(pycharm)的步驟

    Django連接本地mysql數(shù)據(jù)庫(pycharm)的步驟

    這篇文章主要介紹了Django連接本地mysql數(shù)據(jù)庫(pycharm)的步驟,本文分步驟給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-09-09
  • 解決hibernate+mysql寫入數(shù)據(jù)庫亂碼

    解決hibernate+mysql寫入數(shù)據(jù)庫亂碼

    初次沒習(xí)hibernate,其中遇到問題在網(wǎng)上找的答案與大家共同分享!
    2009-07-07
  • mysql sql99語法 內(nèi)連接非等值連接詳解

    mysql sql99語法 內(nèi)連接非等值連接詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于mysql sql99語法 內(nèi)連接非等值連接的相關(guān)知識點文章,有需要的朋友們可以學(xué)習(xí)下。
    2019-09-09
  • MySQL之遞歸小問題

    MySQL之遞歸小問題

    這篇文章主要介紹了MySQL之遞歸小問題,需要的朋友可以參考下
    2017-05-05
  • mysql 5.7.14 安裝配置代碼分享

    mysql 5.7.14 安裝配置代碼分享

    這篇文章主要為大家分享了CentOS 6.6下mysql 5.7.13winx64安裝配置方法圖文教程,感興趣的朋友可以參考一下
    2016-09-09
  • mysql安裝報錯unknown variable mysqlx_port=0.0

    mysql安裝報錯unknown variable mysqlx_port=0.0

    本文主要介紹了mysql安裝報錯unknown variable mysqlx_port=0.0,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • MySQL恢復(fù)誤刪數(shù)據(jù)圖文教程

    MySQL恢復(fù)誤刪數(shù)據(jù)圖文教程

    MySQL誤刪數(shù)據(jù)庫造成了數(shù)據(jù)的丟失,這是非常尷尬的,下面這篇文章主要給大家介紹了關(guān)于MySQL恢復(fù)誤刪數(shù)據(jù)的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-06-06
  • 細說MySQL死鎖與日志二三事

    細說MySQL死鎖與日志二三事

    這篇文章主要和大家一起聊一聊MySQL死鎖與日志二三事,實際業(yè)務(wù)當(dāng)中如何快速的定位線上MySQL問題,修復(fù)異常?本文根據(jù)兩個實際case,分享下相關(guān)的經(jīng)驗與方法,感興趣的小伙伴們可以參考一下
    2017-08-08

最新評論

乌苏市| 威海市| 南阳市| 防城港市| 濮阳市| 临汾市| 兴安县| 苏尼特左旗| 昭苏县| 尚志市| 乌拉特中旗| 辽源市| 泽普县| 滦平县| 留坝县| 武穴市| 伊宁县| 柘城县| 柳江县| 博兴县| 大丰市| 房产| 祁东县| 庄河市| 玉门市| 石阡县| 盐亭县| 碌曲县| 大竹县| 托克逊县| 莱州市| 库尔勒市| 驻马店市| 蕲春县| 高尔夫| 福鼎市| 南岸区| 吉首市| 灵川县| 平武县| 红安县|