成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

聊一聊MySQL觸發(fā)器

數(shù)據(jù)庫 MySQL
在學(xué)習(xí) MySQL 的過程中,可能你了解過觸發(fā)器的概念,不清楚各位是否有詳細(xì)的去學(xué)習(xí)過觸發(fā)器,最近看了幾篇關(guān)于觸發(fā)器的文檔,分享下 MySQL 觸發(fā)器相關(guān)知識。

[[414338]]

本文轉(zhuǎn)載自微信公眾號「MySQL技術(shù)」,作者M(jìn)ySQL技術(shù)。轉(zhuǎn)載本文請聯(lián)系MySQL技術(shù)公眾號。

1.觸發(fā)器簡介

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

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

  1. CREATE 
  2.     [DEFINER = user
  3.     TRIGGER trigger_name 
  4.     trigger_time trigger_event 
  5.     ON tbl_name FOR EACH ROW 
  6.     [trigger_order] 
  7.     trigger_body 
  8.  
  9. trigger_time: { BEFORE | AFTER } 
  10. trigger_event: { INSERT | UPDATE | DELETE } 
  11. 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ù)合語句結(jié)構(gòu)。在觸發(fā)器主體中,可以使用 old 和 new 來引用觸發(fā)器中發(fā)生變化的記錄內(nèi)容。

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

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

  1. # 創(chuàng)建表 創(chuàng)建觸發(fā)器 
  2. mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2)); 
  3. Query OK, 0 rows affected (0.03 sec) 
  4. mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00); 
  5.  
  6. mysql> delimiter // 
  7. mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account 
  8.        FOR EACH ROW 
  9.        BEGIN 
  10.            IF NEW.amount < 0 THEN 
  11.                SET NEW.amount = 0; 
  12.            ELSEIF NEW.amount > 100 THEN 
  13.                SET NEW.amount = 100; 
  14.            END IF; 
  15.        END;// 
  16. mysql> delimiter ; 
  17.  
  18. # 驗證觸發(fā)器作用 
  19. mysql> select * from account; 
  20. +----------+---------+ 
  21. | acct_num | amount  | 
  22. +----------+---------+ 
  23. |      137 |   14.98 | 
  24. |      141 | 1937.50 | 
  25. |       97 | -100.00 | 
  26. +----------+---------+ 
  27. rows in set (0.00 sec) 
  28.  
  29. mysql> update account set amount = 114.98 where acct_num = 137; 
  30. Query OK, 1 row affected (0.01 sec) 
  31. Rows matched: 1  Changed: 1  Warnings: 0 
  32.  
  33. mysql> select * from account; 
  34. +----------+---------+ 
  35. | acct_num | amount  | 
  36. +----------+---------+ 
  37. |      137 |  100.00 | 
  38. |      141 | 1937.50 | 
  39. |       97 | -100.00 | 
  40. +----------+---------+ 
  41. rows in set (0.00 sec) 
  42.  
  43. # 查看觸發(fā)器 
  44. mysql> show triggers; 
  45.  
  46. # 刪除觸發(fā)器 
  47. mysql> drop trigger if exists upd_check; 
  48.  
  49. # 查看數(shù)據(jù)庫實例中所有觸發(fā)器 
  50. SELECT 
  51.  a.TRIGGER_SCHEMA, 
  52.  a.TRIGGER_NAME, 
  53.  a.ACTION_TIMING, 
  54.  a.EVENT_OBJECT_TABLE, 
  55.  a.EVENT_MANIPULATION  
  56. FROM 
  57.  information_schema.`TRIGGERS` a  
  58. WHERE 
  59.  a.TRIGGER_SCHEMA NOT IN ( 'information_schema''performance_schema''mysql''sys' ); 
  60.    
  61. delimiter // 設(shè)置MySQL執(zhí)行結(jié)束標(biāo)志,默認(rèn)為; 

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

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

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

  1. # 禁止刪除數(shù)據(jù) 即使你有權(quán)限 
  2. mysql> select * from student; 
  3. +--------------+------+--------+-------+-------+ 
  4. | increment_id | s_id | s_name | s_sex | s_age | 
  5. +--------------+------+--------+-------+-------+ 
  6. |            1 | 1001 | sdfsd  | 男    |    18 | 
  7. |            2 | 1003 | zsdfsd | 女    |    19 | 
  8. +--------------+------+--------+-------+-------+ 
  9. rows in set (0.00 sec) 
  10.  
  11. mysql> delimiter // 
  12. mysql> CREATE TRIGGER `tri_delstu` BEFORE DELETE ON `student` FOR EACH ROW begin 
  13.     -> declare msg varchar(255); 
  14.     -> set msg="不允許刪除學(xué)生信息"
  15.     -> SIGNAL SQLSTATE 'HY000' SET  MESSAGE_TEXT = msg; 
  16.     -> end; // 
  17. Query OK, 0 rows affected (0.02 sec) 
  18.  
  19. mysql> delimiter ; 
  20. mysql> delete from student where s_id = 1003; 
  21. ERROR 1644 (HY000): 不允許刪除學(xué)生信息 
  22.  
  23. # 禁止更新某個字段 
  24. mysql> delimiter // 
  25. mysql> CREATE TRIGGER trg__updateSid BEFORE UPDATE ON `student` 
  26.     -> FOR EACH ROW 
  27.     -> BEGIN 
  28.     ->  DECLARE msg VARCHAR(100);  
  29.     ->  IF NEW.s_id <> OLD.s_id THEN 
  30.     ->  SET msg='不允許修改學(xué)號';  
  31.     ->  SIGNAL SQLSTATE 'HY000' SET message_text = msg;  
  32.     ->  END IF;  
  33.     -> END; // 
  34. Query OK, 0 rows affected (0.06 sec) 
  35.  
  36. mysql> delimiter ; 
  37. mysql> update student set s_id = 1002 where increment_id = 2; 
  38. ERROR 1644 (HY000): 不允許修改學(xué)號 
  39.  
  40. # 限制修改范圍 
  41. mysql> delimiter // 
  42. mysql> CREATE TRIGGER `tri_update_age` BEFORE UPDATE ON `student` FOR EACH ROW BEGIN 
  43.     ->         DECLARE msg VARCHAR(20); 
  44.     ->   IF (NEW.s_age<0) THEN  
  45.     ->         set msg="年齡不能小于0"
  46.     ->   signal sqlstate 'HY000' set message_text=msg; 
  47.     ->         END IF; 
  48.     -> END; // 
  49. Query OK, 0 rows affected (0.02 sec) 
  50.  
  51. mysql> delimiter ; 
  52. mysql> update student set s_age=10 where s_id = 1001; 
  53. Query OK, 1 row affected (0.01 sec) 
  54. Rows matched: 1  Changed: 1  Warnings: 0 
  55.  
  56. mysql> update student set s_age=-10 where s_id = 1001; 
  57. ERROR 1644 (HY000): 年齡不能小于0 

總結(jié): 

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

 

責(zé)任編輯:武曉燕 來源: MySQL技術(shù)
相關(guān)推薦

2020-10-15 06:56:51

MySQL排序

2022-12-26 08:13:54

子查詢MySQL

2021-04-23 10:31:18

MySQLRole數(shù)據(jù)庫

2021-03-01 18:37:15

MySQL存儲數(shù)據(jù)

2023-09-22 17:36:37

2021-01-28 22:31:33

分組密碼算法

2020-05-22 08:16:07

PONGPONXG-PON

2018-06-07 13:17:12

契約測試單元測試API測試

2019-02-13 14:15:59

Linux版本Fedora

2021-08-04 09:32:05

Typescript 技巧Partial

2021-01-29 08:32:21

數(shù)據(jù)結(jié)構(gòu)數(shù)組

2021-02-06 08:34:49

函數(shù)memoize文檔

2022-08-08 08:25:21

Javajar 文件

2023-07-06 13:56:14

微軟Skype

2023-05-15 08:38:58

模板方法模式

2022-11-01 08:46:20

責(zé)任鏈模式對象

2018-11-29 09:13:47

CPU中斷控制器

2020-08-12 08:34:16

開發(fā)安全We

2021-01-01 09:01:05

前端組件化設(shè)計

2022-11-26 00:00:06

裝飾者模式Component
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产精品久久久久久久久久免费看 | 亚洲欧美在线一区 | 久久新| 精品一区国产 | 亚洲欧美中文日韩在线v日本 | 人人干在线视频 | 欧美成人a∨高清免费观看 老司机午夜性大片 | yiren22综合网成人 | 日韩欧美久久 | 亚洲日本中文 | www.天天操 | 97视频在线免费 | 亚洲人成人一区二区在线观看 | 天天干天天操 | 精品国产精品三级精品av网址 | 搞黄网站在线观看 | 羞羞视频网站 | 久久综合狠狠综合久久综合88 | 亚洲激情视频在线 | 黄毛片| 亚洲精品一区二区久 | 91精品中文字幕一区二区三区 | 欧美精品久久久久 | 久久久久久女 | 午夜免费| 精品区 | 午夜影院中文字幕 | 国产精品视频在线观看 | 国产精品自产拍在线观看蜜 | 日韩一区二区三区精品 | 成人av免费在线观看 | 米奇狠狠鲁 | 成人做爰www免费看视频网站 | 欧美成人免费在线视频 | 久久久免费 | 日韩三级| 国产亚洲精品久久19p | 精品久久久久久亚洲精品 | 黄片毛片免费看 | a级黄色片视频 | 亚洲成人在线免费 |