佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > MySQL觸發(fā)器的使用

MySQL觸發(fā)器的使用

熱門標(biāo)簽:百度競(jìng)價(jià)排名 AI電銷 網(wǎng)站排名優(yōu)化 鐵路電話系統(tǒng) 呼叫中心市場(chǎng)需求 Linux服務(wù)器 服務(wù)外包 地方門戶網(wǎng)站

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

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

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

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

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

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

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

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

結(jié)語(yǔ):

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

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

您可能感興趣的文章:
  • Mysql觸發(fā)器在PHP項(xiàng)目中用來(lái)做信息備份、恢復(fù)和清空
  • 一篇文章帶你深入了解Mysql觸發(fā)器
  • 詳解MySQL數(shù)據(jù)庫(kù)之觸發(fā)器
  • mysql 觸發(fā)器語(yǔ)法與應(yīng)用示例
  • MySql視圖觸發(fā)器存儲(chǔ)過程詳解
  • mysql觸發(fā)器實(shí)時(shí)檢測(cè)一條語(yǔ)句進(jìn)行備份刪除思路詳解

標(biāo)簽:銅川 湖南 崇左 衡水 湘潭 黃山 仙桃 蘭州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL觸發(fā)器的使用》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    绥阳县| 吴旗县| 济阳县| 扎囊县| 体育| 牙克石市| 绥宁县| 马边| 介休市| 砚山县| 甘谷县| 武汉市| 文安县| 射洪县| 庐江县| 武川县| 浙江省| 个旧市| 顺义区| 南丹县| 康定县| 泾阳县| 沁源县| 卢湾区| 陆丰市| 峨眉山市| 安平县| 龙胜| 清河县| 府谷县| 合江县| 鹤壁市| 卢氏县| 西林县| 龙海市| 马山县| 兴隆县| 沭阳县| 叶城县| 福州市| 无棣县|