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

Mysql觸發(fā)器語法解讀(附帶簡單實用例子)

 更新時間:2023年08月30日 11:01:17   作者:good_good_xiu  
這篇文章主要介紹了Mysql觸發(fā)器語法解讀(附帶簡單實用例子),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

觸發(fā)器語法

  • DEFINER:定義該觸發(fā)器的用戶和主機地址,一般默認為當(dāng)前用戶和主機地址。
  • trigger_name:觸發(fā)器名稱 AFTER|BEFORE:觸發(fā)器觸發(fā)狀態(tài),二選一。
  • INSERT|UPDATE|DELETE:觸發(fā)器觸發(fā)狀態(tài),三選一。
  • table_name:監(jiān)控的數(shù)據(jù)表名稱。
  • FOR EACH ROW:行級觸發(fā)器,修改一行數(shù)據(jù)觸發(fā)一次。不寫就默認語句級觸發(fā)器,不管修改多少行數(shù)據(jù),只執(zhí)行一次。
-- 數(shù)據(jù)庫操作工具方法(navicat、sqlyog)
CREATE DEFINER=`root`@`localhost` TRIGGER trigger_name AFTER|BEFORE INSERT|UPDATE|DELETE ON table_name
FOR EACH ROW -- 行級觸發(fā)器,修改一行數(shù)據(jù)觸發(fā)一次。不寫就默認語句級觸發(fā)器,不管修改多少行數(shù)據(jù),只執(zhí)行一次。
BEGIN
	... -- 具體執(zhí)行語句
END

命令行方式

-- 命令行方式
--先更改語句結(jié)束符號
delimiter ##  -- 切換自定義結(jié)束符號,在可視化操作頁面不需要,在命令行中創(chuàng)建觸發(fā)器則需要。
-- 再創(chuàng)建觸發(fā)器
CREATE TRIGGER trigger_name AFTER|BEFORE INSERT|UPDATE|DELETE ON table_name
FOR EACH ROW -- 行級觸發(fā)器
BEGIN
	... -- 具體執(zhí)行語句
END
## -- 代表創(chuàng)建觸發(fā)器語句結(jié)束,這樣就不會執(zhí)行到分號;的時候暫停執(zhí)行了。
delimiter ; --恢復(fù)mysql默認語句結(jié)束符號

實用案例(常用after類型觸發(fā)器)

before觸發(fā)器一般用于在操作數(shù)據(jù)前,對新數(shù)據(jù)的值進行修改。

例如:

考試時長計算,set new.考試時長 = new endtime - new starttime(很少使用)

-- 在插入bysj_et表后觸發(fā)
DROP TRIGGER if EXISTS testi; -- 如果存在testi觸發(fā)器則刪除
CREATE TRIGGER testi AFTER INSERT ON bysj_et
FOR EACH ROW
BEGIN
	INSERT INTO bysj_dt VALUES (new.id,new.et_name);
END
-- 在刪除bysj_et表后觸發(fā)
DROP TRIGGER if EXISTS testd; -- 如果存在testd觸發(fā)器則刪除
CREATE TRIGGER testd AFTER DELETE ON bysj_et
FOR EACH ROW
BEGIN
	DELETE FROM bysj_dt WHERE id = old.id AND dt_name = old.et_name;
END
-- 在更新bysj_et表后觸發(fā)
DROP TRIGGER if EXISTS testu; -- 如果存在testu觸發(fā)器則刪除
CREATE TRIGGER testu AFTER UPDATE ON bysj_et
FOR EACH ROW
BEGIN
	-- SET @oid = old.id; -- 獲取更新前舊數(shù)據(jù)行id
	-- SET @odt_name = old.et_name; -- 獲取更新前舊數(shù)據(jù)行et_name
	-- SET @nid = new.id; -- 獲取新數(shù)據(jù)行id
	-- SET @ndt_name = new.et_name; -- 獲取新數(shù)據(jù)行et_name
	--UPDATE bysj_dt SET id = @nid,dt_name = @ndt_name WHERE id = @oid AND dt_name = @odt_name; --具體執(zhí)行語句
	-- 上面的語句熟悉了之后可以優(yōu)化成下面這樣
	UPDATE bysj_dt SET id = new.id,dt_name = new.et_name WHERE id = old.id AND dt_name = old.et_name;
END

總結(jié)(踩坑記錄)

1.new.字段的值可以在before類型的觸發(fā)器中進行賦值和取值,在after類型觸發(fā)器中只能取值。(在after類型觸發(fā)器中進行對new數(shù)據(jù)行賦值操作會報錯。因為after是在操作之后,已經(jīng)產(chǎn)生了新數(shù)據(jù)行,不可修改。)

2.在insert操作中,只有new數(shù)據(jù)行,沒有old數(shù)據(jù)行。(使用old關(guān)鍵字會報錯)

3.在update操作中,new數(shù)據(jù)行和old數(shù)據(jù)行存在。

4.在delete操作中,只有old數(shù)據(jù)行。(使用new關(guān)鍵字會報錯)

5.在mysql5.7之前的版本,同一張表中,不能存在兩個類型一樣的觸發(fā)器。如果想在一個觸發(fā)器種實現(xiàn)兩種不同的處理語句執(zhí)行,可以增加條件判斷。

例如:使用if語句

CREATE DEFINER=`root`@`localhost` TRIGGER testi AFTER INSERT ON bysj_et
FOR EACH ROW
BEGIN
	IF(new.id = 6) -- 當(dāng)新id為6時
	THEN IF(new.et_name = '6') -- 當(dāng)新id為6,并且name也為6才執(zhí)行插入語句
		THEN INSERT INTO bysj_dt VALUES (new.id,new.et_name);
		END IF;
	END IF;
END;

或使用case when語句

CREATE DEFINER=`root`@`localhost` TRIGGER testi AFTER INSERT ON bysj_et
FOR EACH ROW
BEGIN
	CASE 
	WHEN new.id = 6 AND new.et_name = '6' THEN
		INSERT INTO bysj_dt VALUES (new.id,'等于6');
	WHEN new.id < 6 THEN
		INSERT INTO bysj_dt VALUES (new.id,'小于6');
	ELSE
		INSERT INTO bysj_dt VALUES (100,'100');
END CASE;
END

6.在mysql5.7之后的版本可以存在兩個類型的觸發(fā)器。

但是要注意主鍵策略問題,兩個觸發(fā)器執(zhí)行語句都為新增,當(dāng)新增數(shù)據(jù)表的某列為主鍵時,第二次插入同樣的數(shù)據(jù)就會報錯。

id為6的新數(shù)據(jù)不能插入bysj_dt表兩次。

7.在mysql中,只存在6種觸發(fā)器。(before insert、before update、before delete、after insert、after update、after delete)

8.查看所有觸發(fā)器:show triggers;

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mysql數(shù)據(jù)庫遠程訪問設(shè)置方法

    mysql數(shù)據(jù)庫遠程訪問設(shè)置方法

    MySQL數(shù)據(jù)庫不允許從遠程訪問怎么辦?本文提供了三種解決方法,需要的朋友可以參考下
    2008-02-02
  • MySQL如何快速定位慢SQL的實戰(zhàn)

    MySQL如何快速定位慢SQL的實戰(zhàn)

    在項目中我們會經(jīng)常遇到慢查詢,當(dāng)我們遇到慢查詢的時候一般都要開啟慢查詢?nèi)罩?,本文主要介紹了MySQL如何快速定位慢SQL的實戰(zhàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 如何修改mysql的隔離級別

    如何修改mysql的隔離級別

    MySQL的隔離級別是指數(shù)據(jù)庫事務(wù)的隔離程度,用于控制并發(fā)事務(wù)之間的相互影響,本文就詳細的介紹一下如何修改mysql的隔離級別,感興趣的可以了解一下
    2023-08-08
  • Mysql Error 1826:Duplicate foreign key constraint錯誤問題及解決

    Mysql Error 1826:Duplicate foreign key&n

    MySQL1826錯誤是由于在創(chuàng)建表時,外鍵索引名重復(fù)導(dǎo)致的,解決辦法是在創(chuàng)建外鍵時指定不同的索引名,或修改ForeignKeyName,此問題需注意索引和外鍵名稱的唯一性
    2026-05-05
  • MySQL中刪除重復(fù)數(shù)據(jù)的簡單方法

    MySQL中刪除重復(fù)數(shù)據(jù)的簡單方法

    這篇文章主要介紹了MySQL中刪除重復(fù)數(shù)據(jù)的簡單方法,比起一般的NOT IN語句的效率更為高,需要的朋友可以參考下
    2015-05-05
  • mysql 性能的檢查和調(diào)優(yōu)方法

    mysql 性能的檢查和調(diào)優(yōu)方法

    我一直是使用mysql這個數(shù)據(jù)庫軟件,它工作比較穩(wěn)定,效率也很高。
    2009-05-05
  • MySQL8.0 MGR的維護管理

    MySQL8.0 MGR的維護管理

    數(shù)據(jù)庫已成為企業(yè)和管理員們最為關(guān)注的核心組件之一,本文主要介紹了MySQL8.0 MGR的維護管理,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • MySQL數(shù)據(jù)庫多表操作通關(guān)指南(外鍵約束和多表聯(lián)合查詢)

    MySQL數(shù)據(jù)庫多表操作通關(guān)指南(外鍵約束和多表聯(lián)合查詢)

    看再多的資料不如自己親自動手實戰(zhàn),往往實戰(zhàn)才能滲透知識,下面這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫多表操作的相關(guān)資料,包含外鍵約束和多表聯(lián)合查詢等,需要的朋友可以參考下
    2022-06-06
  • MYSQL開啟遠程訪問權(quán)限的方法

    MYSQL開啟遠程訪問權(quán)限的方法

    在本篇文章里小編給大家整理的是關(guān)于MYSQL開啟遠程訪問權(quán)限的方法,對此有興趣的朋友們可以跟著學(xué)習(xí)下。
    2020-02-02
  • MySQL正確修改最大連接數(shù)的3種方案

    MySQL正確修改最大連接數(shù)的3種方案

    這篇文章主要給大家介紹了關(guān)于MySQL正確修改最大連接數(shù)的3種方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03

最新評論

定西市| 贺州市| 普兰店市| 兰坪| 赣州市| 河西区| 潮安县| 黔西县| 嘉黎县| 筠连县| 离岛区| 花莲市| 绥德县| 县级市| 乐安县| 苗栗县| 威信县| 菏泽市| 涞水县| 博乐市| 隆安县| 河间市| 兰西县| 乐都县| 沙雅县| 卫辉市| 乌拉特前旗| 广南县| 仲巴县| 塘沽区| 同江市| 郸城县| 沙田区| 蓬安县| 孝义市| 天长市| 东乡县| 高要市| 瓮安县| 托克托县| 高唐县|