欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL觸發(fā)器使用詳解

 更新時(shí)間:2015年01月07日 09:49:20   投稿:hebedich  
本文主要詳細(xì)介紹了mysql數(shù)據(jù)庫的觸發(fā)器的相關(guān)知識(shí),非常的全面,有需要的小伙伴參考下吧。

MySQL包含對(duì)觸發(fā)器的支持。觸發(fā)器是一種與表操作有關(guān)的數(shù)據(jù)庫對(duì)象,當(dāng)觸發(fā)器所在表上出現(xiàn)指定事件時(shí),將調(diào)用該對(duì)象,即表的操作事件觸發(fā)表上的觸發(fā)器的執(zhí)行。

創(chuàng)建觸發(fā)器
在MySQL中,創(chuàng)建觸發(fā)器語法如下:

復(fù)制代碼 代碼如下:

CREATE TRIGGER trigger_name
trigger_time
trigger_event ON tbl_name
FOR EACH ROW
trigger_stmt

其中:

trigger_name:標(biāo)識(shí)觸發(fā)器名稱,用戶自行指定;
trigger_time:標(biāo)識(shí)觸發(fā)時(shí)機(jī),取值為 BEFORE 或 AFTER;
trigger_event:標(biāo)識(shí)觸發(fā)事件,取值為 INSERT、UPDATE 或 DELETE;
tbl_name:標(biāo)識(shí)建立觸發(fā)器的表名,即在哪張表上建立觸發(fā)器;
trigger_stmt:觸發(fā)器程序體,可以是一句SQL語句,或者用 BEGIN 和 END 包含的多條語句。

由此可見,可以建立6種觸發(fā)器,即:BEFORE INSERT、BEFORE UPDATE、BEFORE DELETE、AFTER INSERT、AFTER UPDATE、AFTER DELETE。

另外有一個(gè)限制是不能同時(shí)在一個(gè)表上建立2個(gè)相同類型的觸發(fā)器,因此在一個(gè)表上最多建立6個(gè)觸發(fā)器。

trigger_event 詳解
MySQL 除了對(duì) INSERT、UPDATE、DELETE 基本操作進(jìn)行定義外,還定義了 LOAD DATA 和 REPLACE 語句,這兩種語句也能引起上述6中類型的觸發(fā)器的觸發(fā)。

LOAD DATA 語句用于將一個(gè)文件裝入到一個(gè)數(shù)據(jù)表中,相當(dāng)與一系列的 INSERT 操作。

REPLACE 語句一般來說和 INSERT 語句很像,只是在表中有 primary key 或 unique 索引時(shí),如果插入的數(shù)據(jù)和原來 primary key 或 unique 索引一致時(shí),會(huì)先刪除原來的數(shù)據(jù),然后增加一條新數(shù)據(jù),也就是說,一條 REPLACE 語句有時(shí)候等價(jià)于一條。

INSERT 語句,有時(shí)候等價(jià)于一條 DELETE 語句加上一條 INSERT 語句。

INSERT 型觸發(fā)器:插入某一行時(shí)激活觸發(fā)器,可能通過 INSERT、LOAD DATA、REPLACE 語句觸發(fā);
UPDATE 型觸發(fā)器:更改某一行時(shí)激活觸發(fā)器,可能通過 UPDATE 語句觸發(fā);
DELETE 型觸發(fā)器:刪除某一行時(shí)激活觸發(fā)器,可能通過 DELETE、REPLACE 語句觸發(fā)。

BEGIN … END 詳解
在MySQL中,BEGIN … END 語句的語法為:

BEGIN
[statement_list]
END
其中,statement_list 代表一個(gè)或多個(gè)語句的列表,列表內(nèi)的每條語句都必須用分號(hào)(;)來結(jié)尾。
而在MySQL中,分號(hào)是語句結(jié)束的標(biāo)識(shí)符,遇到分號(hào)表示該段語句已經(jīng)結(jié)束,MySQL可以開始執(zhí)行了。因此,解釋器遇到statement_list 中的分號(hào)后就開始執(zhí)行,然后會(huì)報(bào)出錯(cuò)誤,因?yàn)闆]有找到和 BEGIN 匹配的 END。

這時(shí)就會(huì)用到 DELIMITER 命令(DELIMITER 是定界符,分隔符的意思),它是一條命令,不需要語句結(jié)束標(biāo)識(shí),語法為:
DELIMITER new_delemiter
new_delemiter 可以設(shè)為1個(gè)或多個(gè)長(zhǎng)度的符號(hào),默認(rèn)的是分號(hào)(;),我們可以把它修改為其他符號(hào),如$:
DELIMITER $
在這之后的語句,以分號(hào)結(jié)束,解釋器不會(huì)有什么反應(yīng),只有遇到了$,才認(rèn)為是語句結(jié)束。注意,使用完之后,我們還應(yīng)該記得把它給修改回來。

一個(gè)完整的創(chuàng)建觸發(fā)器示例
假設(shè)系統(tǒng)中有兩個(gè)表:
班級(jí)表 class(班級(jí)號(hào) classID, 班內(nèi)學(xué)生數(shù) stuCount)
學(xué)生表 student(學(xué)號(hào) stuID, 所屬班級(jí)號(hào) classID)
要?jiǎng)?chuàng)建觸發(fā)器來使班級(jí)表中的班內(nèi)學(xué)生數(shù)隨著學(xué)生的添加自動(dòng)更新,代碼如下:

復(fù)制代碼 代碼如下:

DELIMITER $
create trigger tri_stuInsert after insert
on student for each row
begin
declare c int;
set c = (select stuCount from class where classID=new.classID);
update class set stuCount = c + 1 where classID = new.classID;
end$
DELIMITER ;

變量詳解
MySQL 中使用 DECLARE 來定義一局部變量,該變量只能在 BEGIN … END 復(fù)合語句中使用,并且應(yīng)該定義在復(fù)合語句的開頭,

即其它語句之前,語法如下:

DECLARE var_name[,...] type [DEFAULT value]
其中:
var_name 為變量名稱,同 SQL 語句一樣,變量名不區(qū)分大小寫;type 為 MySQL 支持的任何數(shù)據(jù)類型;可以同時(shí)定義多個(gè)同類型的變量,用逗號(hào)隔開;變量初始值為 NULL,如果需要,可以使用 DEFAULT 子句提供默認(rèn)值,值可以被指定為一個(gè)表達(dá)式。

對(duì)變量賦值采用 SET 語句,語法為:

SET var_name = expr [,var_name = expr] ...

NEW 與 OLD 詳解

上述示例中使用了NEW關(guān)鍵字,和 MS SQL Server 中的 INSERTED 和 DELETED 類似,MySQL 中定義了 NEW 和 OLD,用來表示

觸發(fā)器的所在表中,觸發(fā)了觸發(fā)器的那一行數(shù)據(jù)。
具體地:
在 INSERT 型觸發(fā)器中,NEW 用來表示將要(BEFORE)或已經(jīng)(AFTER)插入的新數(shù)據(jù);
在 UPDATE 型觸發(fā)器中,OLD 用來表示將要或已經(jīng)被修改的原數(shù)據(jù),NEW 用來表示將要或已經(jīng)修改為的新數(shù)據(jù);
在 DELETE 型觸發(fā)器中,OLD 用來表示將要或已經(jīng)被刪除的原數(shù)據(jù);
使用方法: NEW.columnName (columnName 為相應(yīng)數(shù)據(jù)表某一列名)
另外,OLD 是只讀的,而 NEW 則可以在觸發(fā)器中使用 SET 賦值,這樣不會(huì)再次觸發(fā)觸發(fā)器,造成循環(huán)調(diào)用(如每插入一個(gè)學(xué)生前,都在其學(xué)號(hào)前加“2013”)。

查看觸發(fā)器

和查看數(shù)據(jù)庫(show databases;)查看表格(show tables;)一樣,查看觸發(fā)器的語法如下:

SHOW TRIGGERS [FROM schema_name];
其中,schema_name 即 Schema 的名稱,在 MySQL 中 Schema 和 Database 是一樣的,也就是說,可以指定數(shù)據(jù)庫名,這樣就

不必先“USE database_name;”了。

刪除觸發(fā)器

和刪除數(shù)據(jù)庫、刪除表格一樣,刪除觸發(fā)器的語法如下:

DROP TRIGGER [IF EXISTS] [schema_name.]trigger_name

觸發(fā)器的執(zhí)行順序

我們建立的數(shù)據(jù)庫一般都是 InnoDB 數(shù)據(jù)庫,其上建立的表是事務(wù)性表,也就是事務(wù)安全的。這時(shí),若SQL語句或觸發(fā)器執(zhí)行失敗,MySQL 會(huì)回滾事務(wù),有:

①如果 BEFORE 觸發(fā)器執(zhí)行失敗,SQL 無法正確執(zhí)行。
②SQL 執(zhí)行失敗時(shí),AFTER 型觸發(fā)器不會(huì)觸發(fā)。
③AFTER 類型的觸發(fā)器執(zhí)行失敗,SQL 會(huì)回滾。

小伙伴們是否對(duì)mysql的觸發(fā)器的使用有所了解了呢,如有疑問,就給我留言吧,大家共同進(jìn)步。

相關(guān)文章

  • 如何清除mysql注冊(cè)表

    如何清除mysql注冊(cè)表

    在本篇文章里小編給大家整理的是關(guān)于如何清除mysql注冊(cè)表的相關(guān)知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以參考下。
    2020-08-08
  • MySQL阻塞與死鎖的解決

    MySQL阻塞與死鎖的解決

    本文主要介紹了MySQL阻塞與死鎖的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • MySQL中庫的基本操作指南(推薦!)

    MySQL中庫的基本操作指南(推薦!)

    MySQL這個(gè)數(shù)據(jù)庫是一個(gè)客戶端-服務(wù)器結(jié)構(gòu)的程序,下面這篇文章主要給大家介紹了關(guān)于MySQL中庫的基本操作指南,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • mysql事務(wù)處理用法與實(shí)例代碼詳解

    mysql事務(wù)處理用法與實(shí)例代碼詳解

    這篇文章主要介紹了mysql事務(wù)處理用法與實(shí)例代碼詳解,詳細(xì)的介紹了事物的特性和用法并實(shí)現(xiàn)php和mysql事務(wù)處理例子,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2018-12-12
  • mysql delete limit 使用方法詳解

    mysql delete limit 使用方法詳解

    今天研究cms系統(tǒng)的時(shí)候發(fā)現(xiàn),delete 語句后面有個(gè)limit,一直都是select查詢的時(shí)候才使用,不懂為什么要用這個(gè),正好就百度一下為大家分享下delete中使用limit方法與有點(diǎn)
    2014-11-11
  • MySQL中or、in、union與索引優(yōu)化詳析

    MySQL中or、in、union與索引優(yōu)化詳析

    這篇文章主要給大家介紹了關(guān)于MySQL中or、in、union與索引優(yōu)化的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • mysql不走索引的幾個(gè)問題小結(jié)

    mysql不走索引的幾個(gè)問題小結(jié)

    MySQL中不走索引的問題通常發(fā)生在查詢中使用了函數(shù),這會(huì)使索引失效,從而影響查詢性能,本文就介紹了mysql不走索引的幾個(gè)問題小結(jié),感興趣的可以了解一下
    2023-08-08
  • mysql 5.7.12 winx64手動(dòng)安裝教程

    mysql 5.7.12 winx64手動(dòng)安裝教程

    這篇文章主要為大家詳細(xì)介紹了mysql 5.7.12 winx64手動(dòng)安裝配置方法圖文教程,感興趣的朋友可以參考一下
    2016-12-12
  • mysql中的limit 1 for update的鎖類型

    mysql中的limit 1 for update的鎖類型

    這篇文章主要介紹了mysql中的limit 1 for update的鎖類型,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • mysql 5.7版本修改密碼的簡(jiǎn)單方法

    mysql 5.7版本修改密碼的簡(jiǎn)單方法

    這篇文章主要介紹了mysql 5.7版本修改密碼的簡(jiǎn)單方法,需要的朋友可以參考下
    2017-07-07

最新評(píng)論