最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql觸發(fā)器trigger實例詳解

 更新時間:2021年03月17日 00:13:18   作者:周伯通  
MySQL好像從5.0.2版本就開始支持觸發(fā)器的功能了,本次博客就來介紹一下觸發(fā)器,首先還是談下概念性的東西吧,需要的朋友可以參考下

MySQL好像從5.0.2版本就開始支持觸發(fā)器的功能了,本次博客就來介紹一下觸發(fā)器,首先還是談下概念性的東西吧:

什么是觸發(fā)器

觸發(fā)器是與表有關的數據庫對象,在滿足定義條件時觸發(fā),并執(zhí)行觸發(fā)器中定義的語句集合。觸發(fā)器的這種特性可以協(xié)助應用在數據庫端確保數據的完整性。

舉個例子,比如你現在有兩個表【用戶表】和【日志表】,當一個用戶被創(chuàng)建的時候,就需要在日志表中插入創(chuàng)建的log日志,如果在不使用觸發(fā)器的情況下,你需要編寫程序語言邏輯才能實現,但是如果你定義了一個觸發(fā)器,觸發(fā)器的作用就是當你在用戶表中插入一條數據的之后幫你在日志表中插入一條日志信息。當然觸發(fā)器并不是只能進行插入操作,還能執(zhí)行修改,刪除。

創(chuàng)建觸發(fā)器

創(chuàng)建觸發(fā)器的語法如下:

CREATE TRIGGER trigger_name trigger_time trigger_event ON tb_name FOR EACH ROW trigger_stmt
trigger_name:觸發(fā)器的名稱
tirgger_time:觸發(fā)時機,為BEFORE或者AFTER
trigger_event:觸發(fā)事件,為INSERT、DELETE或者UPDATE
tb_name:表示建立觸發(fā)器的表明,就是在哪張表上建立觸發(fā)器
trigger_stmt:觸發(fā)器的程序體,可以是一條SQL語句或者是用BEGIN和END包含的多條語句
所以可以說MySQL創(chuàng)建以下六種觸發(fā)器:
BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE
AFTER INSERT,AFTER DELETE,AFTER UPDATE

其中,觸發(fā)器名參數指要創(chuàng)建的觸發(fā)器的名字

BEFORE和AFTER參數指定了觸發(fā)執(zhí)行的時間,在事件之前或是之后

FOR EACH ROW表示任何一條記錄上的操作滿足觸發(fā)事件都會觸發(fā)該觸發(fā)器

創(chuàng)建有多個執(zhí)行語句的觸發(fā)器

CREATE TRIGGER 觸發(fā)器名 BEFORE|AFTER 觸發(fā)事件
ON 表名 FOR EACH ROW
BEGIN
  執(zhí)行語句列表
END

其中,BEGIN與END之間的執(zhí)行語句列表參數表示需要執(zhí)行的多個語句,不同語句用分號隔開

tips:一般情況下,mysql默認是以 ; 作為結束執(zhí)行語句,與觸發(fā)器中需要的分行起沖突

     為解決此問題可用DELIMITER,如:DELIMITER ||,可以將結束符號變成||

     當觸發(fā)器創(chuàng)建完成后,可以用DELIMITER ;來將結束符號變成;

mysql> DELIMITER ||
mysql> CREATE TRIGGER demo BEFORE DELETE
  -> ON users FOR EACH ROW
  -> BEGIN
  -> INSERT INTO logs VALUES(NOW());
  -> INSERT INTO logs VALUES(NOW());
  -> END
  -> ||
Query OK, 0 rows affected (0.06 sec)

mysql> DELIMITER ;

上面的語句中,開頭將結束符號定義為||,中間定義一個觸發(fā)器,一旦有滿足條件的刪除操作

就會執(zhí)行BEGIN和END中的語句,接著使用||結束

最后使用DELIMITER ; 將結束符號還原

tigger_event:

load data語句是將文件的內容插入到表中,相當于是insert語句,而replace語句在一般的情況下和insert差不多,但是如果表中存在primary 或者unique索引的時候,如果插入的數據和原來的primary key或者unique相同的時候,會刪除原來的數據,然后增加一條新的數據,所以有的時候執(zhí)行一條replace語句相當于執(zhí)行了一條delete和insert語句。

觸發(fā)器可以是一條SQL語句,也可以是多條SQL代碼塊,那如何創(chuàng)建呢?

DELIMITER $ #將語句的分隔符改為$
BEGIN
sql1;
sql2;
...
sqln
END $
DELIMITER ; #將語句的分隔符改回原來的分號";"
在BEGIN...END語句中也可以定義變量,但是只能在BEGIN...END內部使用:
DECLARE var_name var_type [DEFAULT value] #定義變量,可指定默認值
SET var_name = value #給變量賦值
NEW和OLD的使用:

 根據以上的表格,可以使用一下格式來使用相應的數據:

NEW.columnname:新增行的某列數據
OLD.columnname:刪除行的某列數據
說了這么多現在我們來創(chuàng)建一個觸發(fā)器吧!

現在有表如下:

用戶users表

CREATE TABLE `users` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL,
 `add_time` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `name` (`name`(250)) USING BTREE
) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=latin1;

日志logs表:

CREATE TABLE `logs` (
 `Id` int(11) NOT NULL AUTO_INCREMENT,
 `log` varchar(255) DEFAULT NULL COMMENT '日志說明',
 PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='日志表';

需求是:當在users中插入一條數據,就會在logs中生成一條日志信息。

創(chuàng)建觸發(fā)器:

DELIMITER $
CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(40)character set utf8;
DECLARE s2 VARCHAR(20) character set utf8;#后面發(fā)現中文字符編碼出現亂碼,這里設置字符集
SET s2 = " is created";
SET s1 = CONCAT(NEW.name,s2);   #函數CONCAT可以將字符串連接
INSERT INTO logs(log) values(s1);
END $
DELIMITER ;

這里我用的navicat: 

查看觸發(fā)器SHOW TRIGGERS語句查看觸發(fā)器信息

Tip:

上面我用的navicat直接創(chuàng)建,如果大家用的mysql front,name這里會有個區(qū)別,我們刪除剛才的觸發(fā)器,在Mysql front中測試

drop trigger user_log;#刪除觸發(fā)器

打開Mysql Front:

 

mysql front在編譯sql時,不用定義結尾分隔符,修改后的sql直接這樣既可:

#DELIMITER $
CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(40)character set utf8;
DECLARE s2 VARCHAR(20) character set utf8;
SET s2 = " is created";
SET s1 = CONCAT(NEW.name,s2);   #函數CONCAT可以將字符串連接
INSERT INTO logs(log) values(s1);
END #$
#DELIMITER ;

這里再啰嗦幾句:

tips:SHOW TRIGGERS語句無法查詢指定的觸發(fā)器

在triggers表中查看觸發(fā)器信息

SELECT * FROM information_schema.triggers;

結果顯示了所有觸發(fā)器的詳細信息,同時,該方法可以查詢制定觸發(fā)器的詳細信息

SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='user_log';

tips:所有觸發(fā)器信息都存儲在information_schema數據庫下的triggers表中

     可以使用SELECT語句查詢,如果觸發(fā)器信息過多,最好通過TRIGGER_NAME字段指定查詢

回到上面,我們創(chuàng)建好了觸發(fā)器,繼續(xù)在users中插入數據并查看數據:

insert into users(name,add_time) values('周伯通',now());

好吧,我們再來查看一下logs表吧!

通過上面的例子,可以看到只需要在users中插入用戶的信息,日志會自動記錄到logs表中,這也許就是觸發(fā)器給我?guī)淼谋憬莅桑?nbsp;

限制和注意事項

觸發(fā)器會有以下兩種限制:

1.觸發(fā)程序不能調用將數據返回客戶端的存儲程序,也不能使用采用CALL語句的動態(tài)SQL語句,但是允許存儲程序通過參數將數據返回觸發(fā)程序,也就是存儲過程或者函數通過OUT或者INOUT類型的參數將數據返回觸發(fā)器是可以的,但是不能調用直接返回數據的過程。

2.不能再觸發(fā)器中使用以顯示或隱式方式開始或結束事務的語句,如START TRANS-ACTION,COMMIT或ROLLBACK。

注意事項:MySQL的觸發(fā)器是按照BEFORE觸發(fā)器、行操作、AFTER觸發(fā)器的順序執(zhí)行的,其中任何一步發(fā)生錯誤都不會繼續(xù)執(zhí)行剩下的操作,如果對事務表進行的操作,如果出現錯誤,那么將會被回滾,如果是對非事務表進行操作,那么就無法回滾了,數據可能會出錯。

總結

觸發(fā)器是基于行觸發(fā)的,所以刪除、新增或者修改操作可能都會激活觸發(fā)器,所以不要編寫過于復雜的觸發(fā)器,也不要增加過得的觸發(fā)器,這樣會對數據的插入、修改或者刪除帶來比較嚴重的影響,同時也會帶來可移植性差的后果,所以在設計觸發(fā)器的時候一定要有所考慮。

觸發(fā)器是一種特殊的存儲過程,它在插入,刪除或修改特定表中的數據時觸發(fā)執(zhí)行,它比數據庫本身標準的功能有更精細和更復雜的數據控制能力。

數據庫觸發(fā)器有以下的作用:

1.安全性??梢曰跀祿斓闹凳褂脩艟哂胁僮鲾祿斓哪撤N權利。

  # 可以基于時間限制用戶的操作,例如不允許下班后和節(jié)假日修改數據庫數據。

  # 可以基于數據庫中的數據限制用戶的操作,例如不允許股票的價格的升幅一次超過10%。

2.審計。可以跟蹤用戶對數據庫的操作。   

  # 審計用戶操作數據庫的語句。

  # 把用戶對數據庫的更新寫入審計表。

3.實現復雜的數據完整性規(guī)則

  # 實現非標準的數據完整性檢查和約束。觸發(fā)器可產生比規(guī)則更為復雜的限制。與規(guī)則不同,觸發(fā)器可以引用列或數據庫對象。例如,觸發(fā)器可回退任何企圖吃進超過自己保證金的期貨。

  # 提供可變的缺省值。

4.實現復雜的非標準的數據庫相關完整性規(guī)則。觸發(fā)器可以對數據庫中相關的表進行連環(huán)更新。例如,在auths表author_code列上的刪除觸發(fā)器可導致相應刪除在其它表中的與之匹配的行。

  # 在修改或刪除時級聯修改或刪除其它表中的與之匹配的行。

  # 在修改或刪除時把其它表中的與之匹配的行設成NULL值。

  # 在修改或刪除時把其它表中的與之匹配的行級聯設成缺省值。

  # 觸發(fā)器能夠拒絕或回退那些破壞相關完整性的變化,取消試圖進行數據更新的事務。當插入一個與其主健不匹配的外部鍵時,這種觸發(fā)器會起作用。例如,可以在books.author_code 列上生成一個插入觸發(fā)器,如果新值與auths.author_code列中的某值不匹配時,插入被回退。

5.同步實時地復制表中的數據。

6.自動計算數據值,如果數據的值達到了一定的要求,則進行特定的處理。例如,如果公司的帳號上的資金低于5萬元則立即給財務人員發(fā)送警告數據。

到此這篇關于mysql觸發(fā)器trigger實例詳解的文章就介紹到這了,更多相關mysql觸發(fā)器實例內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • MySQL中union和union all區(qū)別

    MySQL中union和union all區(qū)別

    今天和大家聊一聊,面試中可能遇到的一個知識點,就是union與union all的區(qū)別,具有一定的參考價值,對面試和知識總結有一定的幫助,感興趣的可以了解一下
    2023-08-08
  • IDEA連接mysql又報錯!Server returns invalid timezone. Go to tab and set serverTimezone  prope的問題

    IDEA連接mysql又報錯!Server returns invalid timezone. Go to tab an

    這篇文章主要介紹了IDEA連接mysql又報錯!Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' prope問題,本文通過圖文并茂的形式給大家介紹的非常詳細,需要的朋友可以參考下
    2020-05-05
  • Mysql的數據庫遷移到另一個機器上的方法詳解

    Mysql的數據庫遷移到另一個機器上的方法詳解

    今天小編就為大家分享一篇關于Mysql的數據庫遷移到另一個機器上的方法詳解,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • mysql(master/slave)主從復制原理及配置圖文詳解

    mysql(master/slave)主從復制原理及配置圖文詳解

    這篇文章主要介紹了mysql(master/slave)主從復制原理及配置圖文詳解,以前腳本之家小編發(fā)過相關的內容,但這么好的非常少見特分享一下,需要的朋友可以參考下
    2016-05-05
  • mysql語句如何插入含單引號或反斜杠的值詳解

    mysql語句如何插入含單引號或反斜杠的值詳解

    這篇文章主要給大家介紹了關于mysql語句如何插入含單引號或反斜杠的值的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • MySQL存儲函數以及觸發(fā)器詳解

    MySQL存儲函數以及觸發(fā)器詳解

    這篇文章詳細給大家介紹了MySQL-SQL存儲函數以及觸發(fā)器,文中有詳細的代碼示例,對我們學習MySQL有一定的幫助,感興趣的朋友可以參考閱讀下
    2023-06-06
  • 深入淺析MySQL從刪庫到跑路_高級(一)——數據完整性

    深入淺析MySQL從刪庫到跑路_高級(一)——數據完整性

    數據完整性是指數據的可靠性和準確性,數據完整性類型有四種,本文給大家提到,接下來通過本文給大家介紹MySQL從刪庫到跑路的內容分析,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • 關于MySQL報警的一次分析處理詳解

    關于MySQL報警的一次分析處理詳解

    這篇文章主要給大家介紹了關于MySQL報警的一次分析處理的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • Mysql保持現有內容在后面增加內容的sql語句

    Mysql保持現有內容在后面增加內容的sql語句

    這篇文章主要介紹了Mysql保持現有內容在后面增加內容的sql語句,需要的朋友可以參考下
    2017-05-05
  • MySQL中觸發(fā)器和游標的介紹與使用

    MySQL中觸發(fā)器和游標的介紹與使用

    這篇文章主要給大家介紹了關于MySQL中觸發(fā)器和游標的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03

最新評論

宁夏| 佳木斯市| 平利县| 彭州市| 云安县| 祥云县| 怀柔区| 塔河县| 文化| 科技| 威信县| 夏津县| 太谷县| 新安县| 鄄城县| 威信县| 周宁县| 繁昌县| 商河县| 诏安县| 金溪县| 宝丰县| 勐海县| 青铜峡市| 汨罗市| 原阳县| 锡林郭勒盟| 哈密市| 遂溪县| 定南县| 牡丹江市| 扎赉特旗| 陈巴尔虎旗| 西丰县| 肥东县| 电白县| 易门县| 都江堰市| 息烽县| 温州市| 上虞市|