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

MySQL觸發(fā)器的使用場(chǎng)景及方法實(shí)例

 更新時(shí)間:2020年12月10日 10:06:43   作者:xbhog  
這篇文章主要給大家介紹了關(guān)于MySQL觸發(fā)器的使用場(chǎng)景及方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

觸發(fā)器:

觸發(fā)器的使用場(chǎng)景以及相應(yīng)版本:

觸發(fā)器可以使用的MySQL版本:

  • 版本:MySQL5以上

使用場(chǎng)景例子:

  1. 每當(dāng)增加一個(gè)顧客到某個(gè)數(shù)據(jù)庫(kù)表時(shí),都檢查其電話號(hào)碼格式是否正確,州的縮寫是否為大寫
  2. 每當(dāng)訂購(gòu)一個(gè)產(chǎn)品時(shí),都從庫(kù)存數(shù)量中減去訂購(gòu)的數(shù)量
  3. 無(wú)論何時(shí)刪除一行,都在某個(gè)存檔表中保留一個(gè)副本

即:在某個(gè)表發(fā)生更改時(shí)自動(dòng)處理。

如遇到觸發(fā)器報(bào)錯(cuò)“Not allowed to return a result set from a trigger”;請(qǐng)劃到最后看詳解;

觸發(fā)器的使用:

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

CREATE TRIGGER newproduct AFTER INSERT on products FOR EACH ROW
BEGIN
 DECLARE msg VARCHAR(100);
 SET msg = "products added";
 SIGNAL SQLSTATE 'HY000' SET message_text = msg;
 
END

結(jié)果:

INSERT INTO products VALUES('demo2','1003','xiaoguo','66.6','hello world')
> 1644 - products added
> 時(shí)間: 0.035s

解釋:

首先創(chuàng)建一個(gè)觸發(fā)器:

#newproduct 觸發(fā)器的名字
CREATE TRIGGER newproduct

觸發(fā)的時(shí)機(jī):

BEFORE:觸發(fā)器在觸發(fā)他們的語(yǔ)句之前觸發(fā)

AFTER:觸發(fā)器在觸發(fā)他們的語(yǔ)句完成后觸發(fā)

在這里我們使用的after;也就是在插入結(jié)束后觸發(fā)條件;

DECLARE msg VARCHAR(100);

注意:declare語(yǔ)句是在復(fù)合語(yǔ)句中聲明變量的指令;如果不聲明msg,執(zhí)行語(yǔ)句時(shí),MySQL報(bào)錯(cuò);

SIGNAL SQLSTATE 'HY000' SET message_text = msg;

如果該SIGNAL語(yǔ)句指示特定SQLSTATE值,則該值用于表示指定的條件

"HY000”被稱為“一般錯(cuò)誤":

如果命令出現(xiàn)一般錯(cuò)誤,則會(huì)觸發(fā)后面的message中的消息;

注:該語(yǔ)句只是個(gè)人理解,也是一知半解,如果有更好的解釋,歡迎留言。

觸發(fā)的條件以BEGIN開(kāi)始,END結(jié)束。

觸發(fā)事件:

  1. insert
  2. update
  3. delete

刪除觸發(fā)器:

-- 刪除觸發(fā)器
DROP TRIGGER newproduct;

INSERT觸發(fā)器:

insert觸發(fā)器在insert語(yǔ)句執(zhí)行之前或者之后執(zhí)行,需要注意以下幾點(diǎn):

  1. 在insert觸發(fā)器代碼內(nèi)??梢砸靡粋€(gè)名為NEW的虛擬表,訪問(wèn)被插入的行;
  2. 在before insert觸發(fā)器中,NEW中的值也可以被更新(允許更改被插入的值)
  3. 對(duì)于AUTO_INCREMENT列,NEW在insert執(zhí)行之前包含0,在insert執(zhí)行之后包含新的自動(dòng)生成值

例子:插入一個(gè)新的訂單時(shí),生成一個(gè)新的訂單號(hào)保存到order_num

CREATE TRIGGER neworder AFTER INSERT ON orders for EACH ROW
 SELECT NEW.order_num into @ee;

insert INTO orders(order_date,cust_id) VALUES(NOW(),10001);
SELECT @ee as num;

drop TRIGGER neworder;

解釋:

創(chuàng)建一個(gè)neworder的觸發(fā)器,在插入之后執(zhí)行,且對(duì)每個(gè)插入行執(zhí)行,在insert中有一個(gè)與orders表一摸一樣的虛表,用NEW 表示;

SELECT NEW.order_num into @a;

在虛表中找到我們插入的數(shù)據(jù)的編號(hào),將標(biāo)號(hào)保存在a變量中;

檢測(cè):

insert INTO orders(order_date,cust_id) VALUES(NOW(),10001);
SELECT @ee as num;

插入數(shù)據(jù),輸出插入數(shù)據(jù)的編號(hào)

刪除:

drop TRIGGER neworder;

刪除觸發(fā)器。

例二:

在COURSE表上創(chuàng)建觸發(fā)器,檢查插入時(shí)是否出現(xiàn)課程名相同的記錄,若有則不操作。

CREATE TRIGGER trg_course_in 
BEFORE INSERT ON course
FOR EACH ROW
BEGIN
  DECLARE msg VARCHAR(100); 
  IF EXISTS (SELECT * FROM course where cname=NEW.cname) THEN 
   SET msg='不能輸入相同名稱的課程'; 
   SIGNAL SQLSTATE 'HY000' SET message_text = msg; 
  END IF; 
 
END

例三:向student表中插入信息時(shí),檢查ssex的值必須為男或女。

CREATE TRIGGER trg_ssex AFTER INSERT on student FOR EACH ROW
BEGIN
 DECLARE msg VARCHAR(100);
 IF(NEW.ssex not in('男','女')) THEN
 SET msg ='性別必須為男或女'; 
 SIGNAL SQLSTATE 'HY000' SET message_text = msg;
 END IF
END

UPDATE觸發(fā)器:

  1. 在update觸發(fā)器的代碼中,可以引用一個(gè)名為OLD的虛擬表訪問(wèn)以前的值,即:update未執(zhí)行前的值,還可以引用一個(gè)名為NEW的虛擬表訪問(wèn)新更新的值;
  2. 在before update觸發(fā)器中,NEW中的值可能也被更新(允許修改將要用于update語(yǔ)句中的值);
  3. OLD中的值全部只讀,不能更新。

例一:保證州名縮寫為大寫

CREATE TRIGGER UPDATEevendor BEFORE UPDATE on vendors
FOR EACH ROW SET new.vend_state =UPPER(new.vend_state);

UPDATE vendors SET vend_state='hw' where vend_id='1001';
DROP TRIGGER UPDATEevendor;

注:upper:將文本轉(zhuǎn)換為大寫:

例二:不允許修改student表中的學(xué)號(hào)sno,如果修改該列則顯示錯(cuò)誤信息并取消操作。

CREATE TRIGGER trg_student_updateSno BEFORE UPDATE
FOR EACH ROW
BEGIN
 DECLARE msg VARCHAR(100); 
 IF NEW.sno <> OLD.sno THEN 
 SET msg='不允許修改sno'; 
 SIGNAL SQLSTATE 'HY000' SET message_text = msg; 
 END IF; 
END

DELETE觸發(fā)器:

在DELETE觸發(fā)器在delete語(yǔ)句執(zhí)行之前或之后執(zhí)行:

  1. 在delete觸發(fā)器代碼內(nèi),可以引用OLD的虛擬表,訪問(wèn)被刪除的行;
  2. OLD中的值全部都是只讀,不能更新

例子:

使用old保存將要被刪除的行到一個(gè)存檔表中

首先先創(chuàng)建一個(gè)與orders相似的表:

CREATE TABLE archive_orders LIKE orders;
-- 創(chuàng)建一個(gè)刪除的觸發(fā)器
CREATE TRIGGER deleteorder BEFORE DELETE on orders
for EACH ROW BEGIN
INSERT INTO archive_orders(order_num,order_date,cust_id) VALUES(old.order_num,old.order_date,old.cust_id);
END

解釋:

在刪除order表中行中信息時(shí),將刪除的信息保存到archive_orders中;

刪除原表中一行:

DELETE FROM orders WHERE order_num='20014';

查看效果:

SELECT * FROM archive_orders;

結(jié)束:

注:如果遇到觸發(fā)器報(bào)錯(cuò)“Not allowed to return a result set from a trigger”

  1. 原因:因?yàn)閺腗ySQL5以后不支持觸發(fā)器返回結(jié)果集
  2. 解決方法:在后面語(yǔ)句后面添加 into @變量名
  3. 取數(shù)據(jù):select @變量名

詳細(xì)解釋:https://www.programmersought.com/article/3237975256/

創(chuàng)建用戶變量:http://m.fzitv.net/article/201843.htm

到此這篇關(guān)于MySQL觸發(fā)器的使用場(chǎng)景及方法的文章就介紹到這了,更多相關(guān)MySQL觸發(fā)器使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL外鍵創(chuàng)建失敗1005原因匯總

    MySQL外鍵創(chuàng)建失敗1005原因匯總

    MySQL外鍵創(chuàng)建失敗1005原因有很多,本文整理了一些,希望對(duì)大家有所幫助
    2014-01-01
  • mysql命令行愛(ài)好者必備工具mycli

    mysql命令行愛(ài)好者必備工具mycli

    這篇文章主要介紹了mysql命令行愛(ài)好者必備工具mycli的相關(guān)知識(shí),非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-05-05
  • mysql事務(wù)管理操作詳解

    mysql事務(wù)管理操作詳解

    這篇文章主要介紹了mysql事務(wù)管理操作,結(jié)合實(shí)例形式詳細(xì)分析了mysql事務(wù)管理相關(guān)特性、原理及回滾操作注意事項(xiàng),需要的朋友可以參考下
    2020-04-04
  • MySQL文件權(quán)限存在的安全問(wèn)題和解決方案

    MySQL文件權(quán)限存在的安全問(wèn)題和解決方案

    MySQL文件權(quán)限是用來(lái)控制用戶對(duì)數(shù)據(jù)庫(kù)文件以及目錄的操作權(quán)限,在MySQL中,這些權(quán)限通常由系統(tǒng)管理員分配,通過(guò)GRANT和REVOKE語(yǔ)句進(jìn)行管理,本文給大家介紹了MySQL文件權(quán)限存在的安全問(wèn)題和解決方案,需要的朋友可以參考下
    2024-07-07
  • MySQL/MariaDB的Root密碼重置教程

    MySQL/MariaDB的Root密碼重置教程

    這篇文章主要給大家介紹了關(guān)于MySQL/MariaDB的Root密碼重置的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-09-09
  • mysql left join快速轉(zhuǎn)inner join的過(guò)程

    mysql left join快速轉(zhuǎn)inner join的過(guò)程

    inner join內(nèi)連接,顯示兩個(gè)表中有聯(lián)系的所有數(shù)據(jù)而left join,左鏈接,以左表為參照,顯示所有數(shù)據(jù),右表中沒(méi)有則以null顯示,本文重點(diǎn)給大家講解mysql left join快速轉(zhuǎn)inner join的過(guò)程,需要的朋友參考下吧
    2021-06-06
  • 一文學(xué)會(huì)Mysql數(shù)據(jù)庫(kù)備份與恢復(fù)

    一文學(xué)會(huì)Mysql數(shù)據(jù)庫(kù)備份與恢復(fù)

    數(shù)據(jù)庫(kù)備份是在數(shù)據(jù)丟失的情況下能及時(shí)恢復(fù)重要數(shù)據(jù),防止數(shù)據(jù)丟失的一種重要手段,下面這篇文章主要給大家介紹了關(guān)于Mysql數(shù)據(jù)庫(kù)備份與恢復(fù)的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • mysql中xtrabackup全量備份/增量備份及恢復(fù)

    mysql中xtrabackup全量備份/增量備份及恢復(fù)

    本文詳細(xì)介紹了使用XtraBackup工具進(jìn)行MySQL數(shù)據(jù)庫(kù)的全量備份、增量備份以及恢復(fù)的詳細(xì)步驟,文章詳細(xì)列出了所需目錄結(jié)構(gòu)、配置文件和命令,為數(shù)據(jù)庫(kù)管理員提供了一套完整的備份恢復(fù)解決方案
    2024-09-09
  • mysql 從一個(gè)表中查數(shù)據(jù)并插入另一個(gè)表實(shí)現(xiàn)方法

    mysql 從一個(gè)表中查數(shù)據(jù)并插入另一個(gè)表實(shí)現(xiàn)方法

    這篇文章主要介紹了mysql 從一個(gè)表中查數(shù)據(jù)并插入另一個(gè)表實(shí)現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • CentOS7下mysql 8.0.16 安裝配置方法圖文教程

    CentOS7下mysql 8.0.16 安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了CentOS7下mysql 8.0.16 安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05

最新評(píng)論

闵行区| 丹棱县| 沙河市| 温泉县| 科技| 大关县| 青州市| 衡水市| 福安市| 西盟| 通河县| 澄城县| 兴和县| 丹棱县| 边坝县| 台南市| 手机| 翁牛特旗| 宽城| 南宫市| 汤原县| 旌德县| 开鲁县| 察哈| 务川| 西吉县| 浏阳市| 无为县| 台中县| 乐业县| 偃师市| 平阴县| 衡水市| 清新县| 台南县| 弋阳县| 布拖县| 尤溪县| 合阳县| 道真| 江源县|