MySQL使用觸發程式

2021-05-11 02:11:39 字數 4026 閱讀 8489

觸發程式是與表有關的命名資料庫物件,當表上出現特定事件時,將啟用該物件。在某些觸發程式的用法中,可用於檢查插入到表中的值,或對更新涉及的值進行計算。

觸發程式與表相關,當對表執行insert、delete或update語句時,將啟用觸發程式。可以將觸發程式設定為在執行語句之前或之後啟用。例如,可以在從表中刪除每一行之前,或在更新了每一行後啟用觸發程式。

要想建立觸發程式或捨棄觸發程式,可使用create trigger或drop trigger語句

下面給出了1個簡單的示例,在該示例中,針對insert語句,將觸發程式和表關聯了起來。其作用相當於累加器,能夠將插入表中某一列的值加起來。

在下面的語句中,建立了1個表,並為表建立了1個觸發程式:

mysql>create table account (acct_num int, amount decimal(10,2));

mysql>create trigger ins_sum before insert on account

->for each row set @sum = @sum + new.amount;

create trigger語句建立了與賬戶表相關的、名為ins_sum的觸發程式。它還包括一些子句,這些子句指定了觸發程式啟用時間、觸發程式事件、以及啟用觸發程式時作些什麼:

·         關鍵字before指明了觸發程式的動作時間。在本例中,應在將每一行插入表之前啟用觸發程式。這類允許的其他關鍵字是after。

·         關鍵字insert指明了啟用觸發程式的事件。在本例中,insert語句將導致觸發程式的啟用。你也可以為delete和update語句建立觸發程式。

·         跟在for each row後面的語句定義了每次啟用觸發程式時將執行的程式,對於受觸發語句影響的每一行執行一次。在本例中,觸發的語句是簡單的set語句,負責將插入amount列的值加起來。該語句將列引用為new.amount,意思是「將要插入到新行的amount列的值」。

要想使用觸發程式,將累加器變數設定為0,執行insert語句,然後檢視變數的值:

mysql>set @sum = 0;

mysql>insert into account values(137,14.98),(141,1937.50),(97,-100.00);

mysql>select @sum as 'total amount inserted';

+-----------------------+

| total amount inserted |

+-----------------------+

| 1852.48               |

+-----------------------+

在本例中,執行了insert語句後,@sum的值是14.98 + 1937.50 – 100,或1852.48。

要想銷毀觸發程式,可使用drop trigger語句。如果觸發程式不在預設的方案中,必須指定方案名稱:

mysql>drop trigger test.ins_sum;

觸發程式名稱存在於方案的命名空間內,這意味著,在1個方案中,所有的觸發程式必須具有唯一的名稱。位於不同方案中的觸發程式可以具有相同的名稱。

在1個方案中,所有的觸發程式名稱必須是唯一的,除了該要求外,對於能夠建立的觸發程式的型別還存在其他限制。尤其是,對於具有相同觸發時間和觸發事件的表,不能有2個觸發程式。例如,不能為某一表定義2個before insert觸發程式或2個after update觸發程式。這幾乎不是有意義的限制,這是因為,通過在for each row之後使用begin ... end復合語句結構,能夠定義執行多條語句的觸發程式。請參見本節後面給出的示例。

此外,啟用觸發程式時,對觸發程式執行的語句也存在一些限制:

·         觸發程式不能呼叫將資料返回客戶端的儲存程式,也不能使用採用call語句的動態sql(允許儲存程式通過引數將資料返回觸發程式)。

·         觸發程式不能使用以顯式或隱式方式開始或結束事務的語句,如start transaction、commit或rollback。

使用old和new關鍵字,能夠訪問受觸發程式影響的行中的列(old和new不區分大小寫)。在insert觸發程式中,僅能使用new.col_name

,沒有舊行。在delete觸發程式中,僅能使用old.col_name

,沒有新行。在update觸發程式中,可以使用old.col_name

來引用更新前的某一行的列,也能使用new.col_name

來引用更新後的行中的列。

用old命名的列是唯讀的。你可以引用它,但不能更改它。對於用new命名的列,如果具有select許可權,可引用它。在before觸發程式中,如果你具有update許可權,可使用「set new.col_name = value」更改它的值。這意味著,你可以使用觸發程式來更改將要插入到新行中的值,或用於更新行的值。

在before觸發程式中,auto_increment列的new值為0,不是實際插入新記錄時將自動生成的序列號。

old和new是對觸發程式的mysql擴充套件。

通過使用begin ... end結構,能夠定義執行多條語句的觸發程式。在begin塊中,還能使用儲存子程式中允許的其他語法,如條件和迴圈等。但是,正如儲存子程式那樣,定義執行多條語句的觸發程式時,如果使用mysql程式來輸入觸發程式,需要重新定義語句分隔符,以便能夠在觸發程式定義中使用字元「;」。在下面的示例中,演示了這些要點。在該示例中,定義了1個update觸發程式,用於檢查更新每一行時將使用的新值,並更改值,使之位於0~100的範圍內。它必須是before觸發程式,這是因為,需要在將值用於更新行之前對其進行檢查:

mysql>delimiter //

mysql>create trigger upd_check before update on account

->for each row

->begin

->if new.amount < 0 then

->set new.amount = 0;

->elseif new.amount > 100 then

->set new.amount = 100;

->end if;

->end;//

mysql>delimiter ;

較為簡單的方法是,單獨定義儲存程式,然後使用簡單的call語句從觸發程式呼叫儲存程式。如果你打算從數個觸發程式內部呼叫相同的子程式,該方法也很有幫助。

在觸發程式的執行過程中,mysql處理錯誤的方式如下:

·         如果before觸發程式失敗,不執行相應行上的操作。

·         僅當before觸發程式(如果有的話)和行操作均已成功執行,才執行after觸發程式。

·         如果在before或after觸發程式的執行過程中出現錯誤,將導致呼叫觸發程式的整個語句的失敗。

·         對於事務性表,如果觸發程式失敗(以及由此導致的整個語句的失敗),該語句所執行的所有更改將回滾。對於非事務性表,不能執行這類回滾,因而,即使語句失敗,失敗之前所作的任何更改依然有效。

mysql 觸發器 通知程式 MySQL觸發器

1.概念 觸發器 trigger 是乙個特殊的儲存過程,它的執行不是由程式呼叫,也不是手工啟動,而是由事件觸發。觸發器經常用於加強資料的完整性約束和業務規則等。2.語法 create trigger 觸發器名稱 before after 觸發事件 on 表名 for each row begin 觸...

mysql 觸發器 觸發器使用

1 了解什麼是觸發器?mysql 的觸發器和儲存過程一樣,都是嵌入到mysql的一段程式,觸發器 是由事件觸發某個動作,這些事件包括,插入 更新 刪除等語句。如果定義了觸發程式,觸發器就會觸發執行相應的操作。觸發器 trigger 是個特殊的儲存過程,不同的是,執行儲存過程要使用call語句來呼叫,...

MySQL 使用觸發器

mysql語句在需要時被執行,儲存過程也是如此。但是,如果你想要某條語句 或某些語句 在事件發生時自動執行,怎麼辦呢?例如 所有這些例子的共同之處就是他們都需要在某個表發生更改時自動處理。這確切地說就是觸發器。觸發器是mysql響應以下任意語句而自動執行的一條mysql語句 或位於begin和end...