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

MySQL觸發(fā)器的使用場景及方法實例

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

觸發(fā)器:

觸發(fā)器的使用場景以及相應版本:

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

  • 版本:MySQL5以上

使用場景例子:

  1. 每當增加一個顧客到某個數據庫表時,都檢查其電話號碼格式是否正確,州的縮寫是否為大寫
  2. 每當訂購一個產品時,都從庫存數量中減去訂購的數量
  3. 無論何時刪除一行,都在某個存檔表中保留一個副本

即:在某個表發(fā)生更改時自動處理。

如遇到觸發(fā)器報錯“Not allowed to return a result set from a trigger”;請劃到最后看詳解;

觸發(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

結果:

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

解釋:

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

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

觸發(fā)的時機:

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

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

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

DECLARE msg VARCHAR(100);

注意:declare語句是在復合語句中聲明變量的指令;如果不聲明msg,執(zhí)行語句時,MySQL報錯;

SIGNAL SQLSTATE 'HY000' SET message_text = msg;

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

"HY000”被稱為“一般錯誤":

如果命令出現一般錯誤,則會觸發(fā)后面的message中的消息;

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

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

觸發(fā)事件:

  1. insert
  2. update
  3. delete

刪除觸發(fā)器:

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

INSERT觸發(fā)器:

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

  1. 在insert觸發(fā)器代碼內。可以引用一個名為NEW的虛擬表,訪問被插入的行;
  2. 在before insert觸發(fā)器中,NEW中的值也可以被更新(允許更改被插入的值)
  3. 對于AUTO_INCREMENT列,NEW在insert執(zhí)行之前包含0,在insert執(zhí)行之后包含新的自動生成值

例子:插入一個新的訂單時,生成一個新的訂單號保存到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)建一個neworder的觸發(fā)器,在插入之后執(zhí)行,且對每個插入行執(zhí)行,在insert中有一個與orders表一摸一樣的虛表,用NEW 表示;

SELECT NEW.order_num into @a;

在虛表中找到我們插入的數據的編號,將標號保存在a變量中;

檢測:

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

插入數據,輸出插入數據的編號

刪除:

drop TRIGGER neworder;

刪除觸發(fā)器。

例二:

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

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表中插入信息時,檢查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ā)器的代碼中,可以引用一個名為OLD的虛擬表訪問以前的值,即:update未執(zhí)行前的值,還可以引用一個名為NEW的虛擬表訪問新更新的值;
  2. 在before update觸發(fā)器中,NEW中的值可能也被更新(允許修改將要用于update語句中的值);
  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:將文本轉換為大寫:

例二:不允許修改student表中的學號sno,如果修改該列則顯示錯誤信息并取消操作。

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語句執(zhí)行之前或之后執(zhí)行:

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

例子:

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

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

CREATE TABLE archive_orders LIKE orders;
-- 創(chuàng)建一個刪除的觸發(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表中行中信息時,將刪除的信息保存到archive_orders中;

刪除原表中一行:

DELETE FROM orders WHERE order_num='20014';

查看效果:

SELECT * FROM archive_orders;

結束:

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

  1. 原因:因為從MySQL5以后不支持觸發(fā)器返回結果集
  2. 解決方法:在后面語句后面添加 into @變量名
  3. 取數據:select @變量名

詳細解釋:https://www.programmersought.com/article/3237975256/

創(chuàng)建用戶變量:http://www.dbjr.com.cn/article/201843.htm

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

相關文章

  • Mysql插入數據方式(insert into 、replace into解析)

    Mysql插入數據方式(insert into 、replace into解析)

    這篇文章主要介紹了Mysql插入數據方式(insert into 、replace into解析),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Mysql模糊查詢優(yōu)化方法及測試詳細講解

    Mysql模糊查詢優(yōu)化方法及測試詳細講解

    這篇文章主要介紹了Mysql模糊查詢優(yōu)化方法及測試,在MySQL中支持模糊匹配的方法有很多,且各有各的優(yōu)點,感興趣想要詳細了解可以參考下文
    2023-05-05
  • MYSQL(電話號碼,身份證)數據脫敏的實現

    MYSQL(電話號碼,身份證)數據脫敏的實現

    在日常開發(fā)需求中會經常遇到數據脫敏處理,比如身份證號、手機號,需要使用*進行部分替換顯示。這樣能使敏感隱私信息在一定程度上得到保護。本文就來介紹一下
    2021-05-05
  • 數據庫Mysql性能優(yōu)化詳解

    數據庫Mysql性能優(yōu)化詳解

    這篇文章主要介紹了數據庫Mysql性能優(yōu)化的相關資料,需要的朋友可以參考下
    2016-05-05
  • clickhouse復雜時間格式的轉換方式

    clickhouse復雜時間格式的轉換方式

    這篇文章主要介紹了clickhouse復雜時間格式的轉換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 關于mysql 8.0.13zip包安裝方法

    關于mysql 8.0.13zip包安裝方法

    這篇文章主要介紹了關于mysql 8.0.13zip包安裝方法,非常不錯,具有一定的參考借鑒價值 ,需要的朋友可以參考下
    2018-11-11
  • mysql-connector-java與mysql版本的對應關系說明

    mysql-connector-java與mysql版本的對應關系說明

    這篇文章主要介紹了mysql-connector-java與mysql版本的對應關系說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • 詳解MySQL高可用MMM搭建方案及架構原理

    詳解MySQL高可用MMM搭建方案及架構原理

    本篇文章主要介紹搭建MMM方案以及MMM架構的原理。這里不介紹主從、主主的搭建方法,MMM方案不適用對數據一致性要求很高的業(yè)務。下面一起來學習學習。
    2016-08-08
  • mysql 錯誤號碼1129 解決方法

    mysql 錯誤號碼1129 解決方法

    在本篇文章里我們給大家整理了關于mysql 錯誤號碼1129以及解決方法,需要的朋友們可以參考下。
    2019-08-08
  • MySQL中連接查詢和子查詢的問題

    MySQL中連接查詢和子查詢的問題

    這篇文章主要介紹了MySQL中連接查詢和子查詢的問題,本文通過實例圖文相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09

最新評論