軟件測(cè)試 | 創(chuàng)建觸發(fā)器
創(chuàng)建觸發(fā)器的語(yǔ)法如下:
注意:觸發(fā)器只能創(chuàng)建在永久表(Permanent Table)上,不能對(duì)臨時(shí)表(Temporary Table)創(chuàng)建觸發(fā)器。
其中 trigger_time 是觸發(fā)器的觸發(fā)時(shí)間,可以是 BEFORE 或者 AFTER,BEFORE 的含義指在檢查約束前觸發(fā),而 AFTER 是在檢查約束后觸發(fā)。
而 trigger_event 就是觸發(fā)器的觸發(fā)事件,可以是 INSERT、UPDATE 或者 DELETE。
對(duì)同一個(gè)表相同觸發(fā)時(shí)間的相同觸發(fā)事件,只能定義一個(gè)觸發(fā)器。例如,對(duì)某個(gè)表的不同字段的 AFTER 更新觸發(fā)器,在使用 Oracle 數(shù)據(jù)庫(kù)的時(shí)候,可以定義成兩個(gè)不同的 UPDATE 觸發(fā)器,更新不同的字段時(shí)觸發(fā)單獨(dú)的觸發(fā)器,但是在 MYSQL 數(shù)據(jù)庫(kù)中,只能定義成一個(gè)觸發(fā)
器,在觸發(fā)器中通過(guò)判斷更新的字段進(jìn)行對(duì)應(yīng)的處理。 使用別名 OLD 和 NEW 來(lái)引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容,這與其他的數(shù)據(jù)庫(kù)是相似的。
現(xiàn)在觸發(fā)器還只支持行級(jí)觸發(fā)的,不支持語(yǔ)句級(jí)觸發(fā)。 在樣例數(shù)據(jù)庫(kù)中,為 film 表創(chuàng)建了 AFTER INSERT 的觸發(fā)器,具體如下:
插入 film 表記錄的時(shí)候,會(huì)向 film_text 表中也插入相應(yīng)的記錄。
對(duì)于 INSERT INOT…ON DUPLICATE KEY UPDATE…語(yǔ)句來(lái)說(shuō),觸發(fā)觸發(fā)器的順序可能會(huì)造成疑惑。下面對(duì) film 表分別創(chuàng)建了 BEFROE INSERT、AFTER INSERT、BEFORE UPDATE、AFTER UPDATE 觸發(fā)器,然后插入記錄,觀察觸發(fā)器的觸發(fā)情況:
從上面的例子可以知道,對(duì)于有重復(fù)記錄,需要進(jìn)行 UPDATE 操作的 INSERT,觸發(fā)器觸發(fā)的順序是 BEFORE INSERT、BEFORE UPDATE、AFTER UPDATE;對(duì)于沒(méi)有重復(fù)記錄的 INSERT,就是簡(jiǎn)單的執(zhí)行 INSERT 操作,觸發(fā)器觸發(fā)的順序是 BEFORE INSERT、AFTER INSERT。對(duì)于那些實(shí)際執(zhí)行 UPDATE 操作的記錄,仍然會(huì)執(zhí)行 BEFORE INSERT 觸發(fā)器的內(nèi)容,在設(shè)計(jì)觸發(fā)器的時(shí)候一定要考慮這種情況,避免錯(cuò)誤地觸發(fā)了觸發(fā)器。
搜索微信公眾號(hào):TestingStudio霍格沃茲的干貨都很硬核