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

從零開始MySQL觸發(fā)器實戰(zhàn)攻略

 更新時間:2024年02月04日 08:42:03   作者:尼羲  
想要掌握MySQL觸發(fā)器的實戰(zhàn)技巧嗎?從零開始,跟我一起揭開觸發(fā)器神秘的面紗!輕松入門,迅速提升,這個指南將讓你的MySQL技能煥然一新!一探究竟,驚喜等你發(fā)現(xiàn)!

在學習 MySQL 的過程中,可能你了解過觸發(fā)器的概念,不清楚各位是否有詳細的去學習過觸發(fā)器,最近看了幾篇關于觸發(fā)器的文檔,分享下 MySQL 觸發(fā)器相關知識。

1.觸發(fā)器簡介

觸發(fā)器即 triggers ,它是與表有關的數(shù)據(jù)庫對象,在滿足定義條件時觸發(fā),并執(zhí)行觸發(fā)器中定義的語句集合。它的執(zhí)行不是由程序調(diào)用,也不是手工啟動,而是由事件來觸發(fā),比如當對一個表進行操作( insert,delete, update)時就會激活它執(zhí)行。觸發(fā)器經(jīng)常用于加強數(shù)據(jù)的完整性約束和業(yè)務規(guī)則等。

參考官方文檔,觸發(fā)器創(chuàng)建語法模板如下:

CREATE
    [DEFINER = user]
    TRIGGER trigger_name
    trigger_time trigger_event
    ON tbl_name FOR EACH ROW
    [trigger_order]
    trigger_body

trigger_time: { BEFORE | AFTER }
trigger_event: { INSERT | UPDATE | DELETE }
trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

觸發(fā)器只能創(chuàng)建在永久表上,不能對臨時表或視圖創(chuàng)建觸發(fā)器。觸發(fā)器的名稱在單個數(shù)據(jù)庫內(nèi)是唯一的。參考上面創(chuàng)建語句,觸發(fā)器創(chuàng)建有幾點要素,下面簡要說明下:

trigger_time:是觸發(fā)動作時間,可以是 BEFORE 或 AFTER ,表示觸發(fā)器在要修改的每一行之前或之后激活。

trigger_event:指示激活觸發(fā)器的操作類型。這些 trigger_event 值是被允許的:

  • insert:只要向表中插入新行,觸發(fā)器就會激活。例如 insert 、load data、replace 語句。
  • update:更改表中某一行數(shù)據(jù)時激活觸發(fā)器。例如 update 語句。
  • delete:從表中刪除某一行數(shù)據(jù)時激活觸發(fā)器。例如 delete 和 replace 語句。表上的 DROP TABLE 和 TRUNCATE TABLE 語句不會激活此觸發(fā)器,因為它們不使用 delete ,刪除分區(qū)也不會激活 delete 觸發(fā)器。

trigger_body:是觸發(fā)器激活時要執(zhí)行的語句。如果要執(zhí)行多個語句,可使用 BEGIN…END 復合語句結構。在觸發(fā)器主體中,可以使用 old 和 new 來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容。

2.觸發(fā)器具體操作

下面來看下觸發(fā)器相關的具體操作:

# 創(chuàng)建表 創(chuàng)建觸發(fā)器
mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));
Query OK, 0 rows affected (0.03 sec)
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);

mysql> delimiter //
mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account
       FOR EACH ROW
       BEGIN
           IF NEW.amount < 0 THEN
               SET NEW.amount = 0;
           ELSEIF NEW.amount > 100 THEN
               SET NEW.amount = 100;
           END IF;
       END;//
mysql> delimiter ;

# 驗證觸發(fā)器作用
mysql> select * from account;
+----------+---------+
| acct_num | amount  |
+----------+---------+
|      137 |   14.98 |
|      141 | 1937.50 |
|       97 | -100.00 |
+----------+---------+
3 rows in set (0.00 sec)

mysql> update account set amount = 114.98 where acct_num = 137;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from account;
+----------+---------+
| acct_num | amount  |
+----------+---------+
|      137 |  100.00 |
|      141 | 1937.50 |
|       97 | -100.00 |
+----------+---------+
3 rows in set (0.00 sec)

# 查看觸發(fā)器
mysql> show triggers;

# 刪除觸發(fā)器
mysql> drop trigger if exists upd_check;

# 查看數(shù)據(jù)庫實例中所有觸發(fā)器
SELECT
    a.TRIGGER_SCHEMA,
    a.TRIGGER_NAME,
    a.ACTION_TIMING,
    a.EVENT_OBJECT_TABLE,
    a.EVENT_MANIPULATION 
FROM
    information_schema.`TRIGGERS` a 
WHERE
    a.TRIGGER_SCHEMA NOT IN ( 'information_schema', 'performance_schema', 'mysql', 'sys' );
  
delimiter // 設置MySQL執(zhí)行結束標志,默認為;

上面展示了一些關于觸發(fā)器的基本操作,其實觸發(fā)器在生產(chǎn)環(huán)境中還是比較少見的,即使它能解決我們某些數(shù)據(jù)庫需求,因為觸發(fā)器的使用存在一系列的缺點,簡要總結幾點缺點如下:

  • 使用觸發(fā)器實現(xiàn)的業(yè)務邏輯在出現(xiàn)問題時很難進行定位,特別是涉及到多個觸發(fā)器的情況下,會使后期維護變得困難。
  • 大量使用觸發(fā)器容易導致代碼結構被打亂,增加了程序的復雜性,
  • 如果需要變動的數(shù)據(jù)量較大時,觸發(fā)器的執(zhí)行效率會非常低。
  • 觸發(fā)器隱式調(diào)用容易被忽略,出現(xiàn)問題不好排查。

但是觸發(fā)器也并不是一無用處,比如我們不想讓人刪除或更新這個表的數(shù)據(jù),可以用觸發(fā)器實現(xiàn),下面的一些場景可能對你有所啟發(fā):

# 禁止刪除數(shù)據(jù) 即使你有權限
mysql> select * from student;
+--------------+------+--------+-------+-------+
| increment_id | s_id | s_name | s_sex | s_age |
+--------------+------+--------+-------+-------+
|            1 | 1001 | sdfsd  | 男    |    18 |
|            2 | 1003 | zsdfsd | 女    |    19 |
+--------------+------+--------+-------+-------+
2 rows in set (0.00 sec)

mysql> delimiter //
mysql> CREATE TRIGGER `tri_delstu` BEFORE DELETE ON `student` FOR EACH ROW begin
    -> declare msg varchar(255);
    -> set msg="不允許刪除學生信息";
    -> SIGNAL SQLSTATE 'HY000' SET  MESSAGE_TEXT = msg;
    -> end; //
Query OK, 0 rows affected (0.02 sec)

mysql> delimiter ;
mysql> delete from student where s_id = 1003;
ERROR 1644 (HY000): 不允許刪除學生信息

# 禁止更新某個字段
mysql> delimiter //
mysql> CREATE TRIGGER trg__updateSid BEFORE UPDATE ON `student`
    -> FOR EACH ROW
    -> BEGIN
    ->  DECLARE msg VARCHAR(100); 
    ->  IF NEW.s_id <> OLD.s_id THEN
    ->  SET msg='不允許修改學號'; 
    ->  SIGNAL SQLSTATE 'HY000' SET message_text = msg; 
    ->  END IF; 
    -> END; //
Query OK, 0 rows affected (0.06 sec)

mysql> delimiter ;
mysql> update student set s_id = 1002 where increment_id = 2;
ERROR 1644 (HY000): 不允許修改學號

# 限制修改范圍
mysql> delimiter //
mysql> CREATE TRIGGER `tri_update_age` BEFORE UPDATE ON `student` FOR EACH ROW BEGIN
    ->         DECLARE msg VARCHAR(20);
    ->   IF (NEW.s_age<0) THEN 
    ->         set msg="年齡不能小于0";
    ->   signal sqlstate 'HY000' set message_text=msg;
    ->         END IF;
    -> END; //
Query OK, 0 rows affected (0.02 sec)

mysql> delimiter ;
mysql> update student set s_age=10 where s_id = 1001;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update student set s_age=-10 where s_id = 1001;
ERROR 1644 (HY000): 年齡不能小于0

總結:

本篇文章簡要介紹了觸發(fā)器的定義及使用案例。在業(yè)務邏輯復雜或表變動比較頻繁的系統(tǒng)還是不推薦使用觸發(fā)器,當然它也是有自己的應用場景,無論怎樣,觸發(fā)器的邏輯總是越簡單越好,我們應該讓數(shù)據(jù)庫做它擅長做的事,不能想著所有邏輯都在數(shù)據(jù)庫層面實現(xiàn)。

到此這篇關于從零開始MySQL觸發(fā)器實戰(zhàn)攻略的文章就介紹到這了,更多相關mysql觸發(fā)器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 基于mssql導mysql遇到的問題

    基于mssql導mysql遇到的問題

    本篇文章是對mssql導mysql遇到的問題,進行了詳細的分析介紹,需要的朋友參考下
    2013-06-06
  • 高版本Mysql使用group?by分組報錯的解決方案

    高版本Mysql使用group?by分組報錯的解決方案

    GROUP?BY?語句用于結合合計函數(shù),根據(jù)一個或多個列對結果集進行分組,下面這篇文章主要給大家介紹了關于高版本Mysql使用group?by分組報錯的解決方案,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-03-03
  • mysql之create index和alter add index用法及說明

    mysql之create index和alter add index用法及說明

    本文詳細介紹了MySQL創(chuàng)建索引的三種方法,包括直接創(chuàng)建索引和使用ALTER TABLE添加索引,并對比了兩種方法的優(yōu)缺點,建議在創(chuàng)建索引時優(yōu)先使用ALTER TABLE以提高效率
    2026-06-06
  • MySQL的鎖機制使用詳解

    MySQL的鎖機制使用詳解

    這篇文章主要介紹了MySQL的鎖機制使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • MySQL Hash索引和B-Tree索引的區(qū)別

    MySQL Hash索引和B-Tree索引的區(qū)別

    MySQL Hash索引和B-Tree索引的區(qū)別究竟在哪里呢?相信很多人都有這樣的疑問,下文對兩者的區(qū)別進行了詳細的分析,需要的朋友可以參考下
    2014-03-03
  • MySQL執(zhí)行過程中選擇最佳的執(zhí)行路徑的方法(核心流程)

    MySQL執(zhí)行過程中選擇最佳的執(zhí)行路徑的方法(核心流程)

    文章介紹MySQL查詢優(yōu)化器如何通過解析、生成執(zhí)行計劃及成本評估選擇最佳路徑,依賴統(tǒng)計信息如表行數(shù)和索引基數(shù),開發(fā)者需創(chuàng)建索引、更新統(tǒng)計信息、優(yōu)化SQL寫法及使用EXPLAIN工具輔助優(yōu)化,感興趣的朋友跟隨小編一起看看吧
    2025-09-09
  • MySQL加密和解密實例詳解

    MySQL加密和解密實例詳解

    這篇文章主要介紹了MySQL加密和解密實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • MySQL兩個表的親密接觸-連接查詢的原理分析

    MySQL兩個表的親密接觸-連接查詢的原理分析

    這篇文章主要介紹了MySQL兩個表的親密接觸-連接查詢的原理,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • mysql8.0.20安裝與連接navicat的方法及注意事項

    mysql8.0.20安裝與連接navicat的方法及注意事項

    這篇文章主要介紹了mysql8.0.20安裝與連接navicat的方法及注意事項,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • mysql字符集相關總結

    mysql字符集相關總結

    這篇文章主要介紹了Python 中刪除文件的幾種方法匯總,幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下
    2021-03-03

最新評論

乐山市| 秭归县| 秦安县| 绥化市| 镇巴县| 东城区| 林周县| 昆山市| 绥滨县| 淮安市| 二连浩特市| 革吉县| 浦县| 庆阳市| 迁西县| 金沙县| 洱源县| 离岛区| 洛川县| 千阳县| 中牟县| 沁源县| 闸北区| 景洪市| 光山县| 交口县| 东乡县| 台北县| 綦江县| 平泉县| 云霄县| 西藏| 会昌县| 曲靖市| 商都县| 确山县| 延安市| 上栗县| 库车县| 文成县| 桃江县|