觸發(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)相同的功能,例如:
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 ;
大多數(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)文章!
標(biāo)簽:西寧 徐州 龍巖 南充 自貢 麗水 無錫 迪慶
巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL觸發(fā)器的使用》,本文關(guān)鍵詞 MySQL,觸發(fā)器,的,使用,MySQL,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。