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

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

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

觸發(fā)器語法

  • DEFINER:定義該觸發(fā)器的用戶和主機(jī)地址,一般默認(rèn)為當(dāng)前用戶和主機(jī)地址。
  • 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:行級(jí)觸發(fā)器,修改一行數(shù)據(jù)觸發(fā)一次。不寫就默認(rèn)語句級(jí)觸發(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 -- 行級(jí)觸發(fā)器,修改一行數(shù)據(jù)觸發(fā)一次。不寫就默認(rèn)語句級(jí)觸發(fā)器,不管修改多少行數(shù)據(jù),只執(zhí)行一次。
BEGIN
	... -- 具體執(zhí)行語句
END

命令行方式

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

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

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

例如:

考試時(shí)長計(jì)算,set new.考試時(shí)長 = 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ā)器中進(jìn)行賦值和取值,在after類型觸發(fā)器中只能取值。(在after類型觸發(fā)器中進(jìn)行對(duì)new數(shù)據(jù)行賦值操作會(huì)報(bào)錯(cuò)。因?yàn)閍fter是在操作之后,已經(jīng)產(chǎn)生了新數(shù)據(jù)行,不可修改。)

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

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

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

5.在mysql5.7之前的版本,同一張表中,不能存在兩個(gè)類型一樣的觸發(fā)器。如果想在一個(gè)觸發(fā)器種實(shí)現(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時(shí)
	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之后的版本可以存在兩個(gè)類型的觸發(fā)器。

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

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é)

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

相關(guān)文章

  • 解決Navicat導(dǎo)入數(shù)據(jù)庫數(shù)據(jù)結(jié)構(gòu)sql報(bào)錯(cuò)datetime(0)的問題

    解決Navicat導(dǎo)入數(shù)據(jù)庫數(shù)據(jù)結(jié)構(gòu)sql報(bào)錯(cuò)datetime(0)的問題

    這篇文章主要介紹了解決Navicat導(dǎo)入數(shù)據(jù)庫數(shù)據(jù)結(jié)構(gòu)sql報(bào)錯(cuò)datetime(0)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • MySQL數(shù)據(jù)庫修復(fù)方法(MyISAM/InnoDB)

    MySQL數(shù)據(jù)庫修復(fù)方法(MyISAM/InnoDB)

    這篇文章主要為大家整理了7條修復(fù)MySQL數(shù)據(jù)庫的方法,當(dāng)簡單的重啟對(duì)數(shù)據(jù)庫不起作用,或者有表崩潰時(shí),需要的朋友可以參考下
    2014-06-06
  • 最新MySQL高級(jí)SQL語句大全

    最新MySQL高級(jí)SQL語句大全

    這篇文章主要介紹了MySQL高級(jí)SQL語句,主要包括常用查詢知識(shí)order by按關(guān)鍵字排序的sql語句,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • MySQL中的主鍵以及設(shè)置其自增的用法教程

    MySQL中的主鍵以及設(shè)置其自增的用法教程

    這篇文章主要介紹了MySQL中的主鍵以及設(shè)置其自增的用法教程,是MySQL入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • MySQL命令執(zhí)行sql文件的方法小結(jié)

    MySQL命令執(zhí)行sql文件的方法小結(jié)

    本文給大家分享MySQL命令執(zhí)行sql文件的兩種方法,每種方法給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2023-11-11
  • MySQL中常見的幾種日志匯總

    MySQL中常見的幾種日志匯總

    這篇文章主要給大家介紹了關(guān)于MySQL中常見的幾種日志,文中通過實(shí)例代碼結(jié)束的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用MySQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • centos 6下安裝innodb_ruby

    centos 6下安裝innodb_ruby

    innodb_ruby 是使用 Ruby 編寫的 InnoDB 文件格式解析器。innodb_ruby 的目的是暴露一些其他隱藏的 InnoDB 原理。這些代碼并不適合生產(chǎn)環(huán)境使用。
    2017-01-01
  • MySQL和連接相關(guān)的timeout 的詳細(xì)整理

    MySQL和連接相關(guān)的timeout 的詳細(xì)整理

    這篇文章主要介紹了MySQL和連接相關(guān)的timeout 的詳細(xì)整理的相關(guān)資料,本文主要總結(jié)下和連接有關(guān)的timeout,需要的朋友可以參考下
    2017-08-08
  • Mysql字符串字段判斷是否包含某個(gè)字符串的2種方法

    Mysql字符串字段判斷是否包含某個(gè)字符串的2種方法

    這篇文章主要介紹了Mysql字符串字段判斷是否包含某個(gè)字符串的2種方法,本文使用Like和find_in_set兩種方法實(shí)現(xiàn),需要的朋友可以參考下
    2015-01-01
  • Mysql的SELECT語句與顯示表結(jié)構(gòu)詳解

    Mysql的SELECT語句與顯示表結(jié)構(gòu)詳解

    這篇文章主要介紹了Mysql的SELECT語句與顯示表結(jié)構(gòu)詳解的相關(guān)資料,需要的朋友可以參考下
    2023-01-01

最新評(píng)論