MySQL學習之觸發器

文章目錄

  • 前言
  • 什么是觸發器(Trigger)?
    • 觸發器的特點
  • MySQL中觸發器的用法
    • 創建
    • NEW 與 OLD
    • 舉例
    • 其他操作
  • 注意事項
  • 后續內容
  • 參考目錄


前言

閱讀本文前請注意最后編輯時間,文章內容可能與目前最新的技術發展情況相去甚遠。歡迎各位評論與私信,指出錯誤或是進行交流等。


什么是觸發器(Trigger)?

觸發器(Trigger)是數據庫中的一種特殊存儲程序,它綁定到某張表(或視圖)上,并在特定的數據庫操作(如 INSERT、UPDATE 或 DELETE)發生時自動執行預定義的操作。觸發器無需手動調用,是一種事件驅動的機制。

觸發器的特點

  1. 自動執行:一旦滿足觸發條件,觸發器會在相關操作執行之前或之后自動運行。

  2. 綁定表:每個觸發器都與特定的表綁定,只對該表的操作有效。

  3. 觸發器類型包括:
    AFTER DELETE:在刪除數據之后執行。
    BEFORE DELETE:在刪除數據之前執行。
    AFTER UPDATE:在更新數據之后執行。
    BEFORE UPDATE:在更新數據之前執行。
    AFTER INSERT:在插入數據之后執行。
    BEFORE INSERT:在插入數據之前執行。

  4. 適用范圍:
    觸發器作用于每一行操作(FOR EACH ROW),或是整個語句的操作(FOR EACH STATEMENT,但在 MySQL 中不支持)。

MySQL中觸發器的用法

創建

DELIMITER $$CREATE TRIGGER trigger_name { BEFORE | AFTER } { INSERT | UPDATE | DELETE }
ON table_name FOR EACH ROW
BEGIN執行語句
END $$DELIMITER ;

NEW 與 OLD

MySQL中定義了NEW和OLD,用來表示觸發器的所在表中,觸發了觸發器的那一行數據。引用觸發器中發生變化的記錄內容,具體地:

觸發器類型觸發器類型NEW和OLD的使用
INSERT型觸發器NEW表示將要或者已經新增的數據
UPDATE型觸發器OLD表示修改之前的數據,NEW表示將要或已經修改后的數據
DELETE 型觸發器OLD表示將要或者已經刪除的數據

使用方法:
NEW.columnName (columnName為相應數據表某一列名)
OLD.columnName

舉例

下面是一個用于清理數據的觸發器代碼示例,為了使大家更好的理解觸發器的使用,下面將為大家分析每句代碼的作用以及使用方法。

(題目:在社區表community中,當新增新的小區后;觸發事件為當前新增小區這個insert操作。當新增小區樓棟數量 大于20棟 且 住戶不低于150人,則在訪客記錄表manual_record中 刪除 離開時間(out_time)距現在是一年以前 且 所有已離開的訪客記錄 (is_leave=1))

DELIMITER $$
?
CREATE TRIGGER update_is_leave_cleanup
AFTER INSERT ON community
FOR EACH ROW
BEGIN-- 檢查新增小區樓棟數量是否 大于20棟 且 住戶是否不低于150人IF NEW.term_count > 20 AND NEW.per_count >= 150 THEN-- 刪除所有離開時間超過一年的訪客記錄DELETE FROM manual_recordWHERE is_leave = 1AND out_time < DATE_SUB(NOW(), INTERVAL 1 YEAR);END IF;
END$$
?
DELIMITER ;

CREATE TRIGGER update_is_leave_cleanup:創建一個名為 update_is_leave_cleanup 的觸發器。
AFTER INSERT:表示在 community表執行 INSERT操作后觸發該觸發器。
ON community:觸發器綁定到 community表。
FOR EACH ROW:觸發器對 insert 操作的每一行都生效(逐行觸發)。
BEGIN 和 END 標志觸發器主體,表示觸發器的邏輯操作。

 -- 檢查新增小區樓棟數量是否 大于20棟 且 住戶是否不低于150人IF NEW.term_count > 20 AND NEW.per_count >= 150 THEN
  • NEW.字段名:表示插入的新值。
  • 條件含義:
    檢查新增小區樓棟數量是否 大于20棟 且 住戶是否不低于150人。
    如果 NEW.term_count > 20 且 NEW.per_count >= 150,說明當前新增記錄符合條件。
DELETE FROM manual_record
WHERE is_leave = 1AND out_time < DATE_SUB(NOW(), INTERVAL 1 YEAR);
  • 條件 1:is_leave = 1:
    僅刪除已經離開的記錄。

  • 條件 2:out_time < DATE_SUB(NOW(), INTERVAL 1 YEAR):
    out_time 是記錄的離開時間。
    DATE_SUB(NOW(), INTERVAL 1 YEAR) 計算當前時間減去 1 年的日期。
    如果 out_time 早于一年前,則認為該記錄已過期,刪除之。

 END IF; 結束條件語句。END $$ 標志觸發器邏輯結束。DELIMITER $$ 重置分隔符

其他操作

# 查看觸發器
show triggers;# 刪除觸發器
drop trigger if exists trigger_name;# 需要注意的是,MySQL 不支持直接禁用單個觸發器,但可以通過禁用整個表的觸發器來達到類似的效果。
# 禁用所有觸發器(全局禁用)
SET GLOBAL DISABLE_TRIGGERS = 1;# 啟用所有觸發器(全局啟用)
SET GLOBAL DISABLE_TRIGGERS = 0;

注意事項

  • 觸發器性能:如果表數據量大,使用觸發器可能會影響性能。假設觸發器每次執行花費1s, insert table 500條數據,那么就需要觸發500次觸發器,光是觸發器執行的時間就花費了500s,而insert500條數據一共是1s,那么這個insert的效率就非常低了。

  • 事務支持:如果 UPDATE 操作失敗,觸發器邏輯也不會執行。

  • 調試觸發器:可以通過啟用 MySQL 日志或手動檢查數據變化來調試觸發器。

  • 數據備份:刪除記錄操作是不可逆的,在執行觸發器前確保數據已備份。

  • MYSQL中觸發器中不能對本表進行insert,update,delete操作,以免遞歸循環觸發

  • 觸發器是針對每一行的;在增刪改非常頻繁的表上使用觸發器會非常消耗資源。

后續內容

關于MySQL已經是非常成熟的技術了,且優秀的博文和視頻非常之多,所以就不打算做重復的工作。貼一些優秀的內容共同學習即可

MySQL索引:https://blog.csdn.net/justry_deng/article/details/81458470
https://blog.csdn.net/qq_35190492/article/details/109257302
https://blog.csdn.net/2401_85373732/article/details/145061201

MySQL事務:https://blog.csdn.net/weixin_58376680/article/details/136993032
https://blog.csdn.net/qq_56880706/article/details/122653735

MySQL鎖:https://blog.csdn.net/qq_44700578/article/details/139912042

MySQL優化:https://blog.csdn.net/yuan2019035055/article/details/122310447(SQL優化、索引優化、鎖機制、主從復制)
https://blog.csdn.net/xiaofeng10330111/article/details/105360974(索引優化)


參考目錄

https://www.bilibili.com/video/BV1iF411z7Pu
https://blog.csdn.net/Future_yzx/article/details/144633142
https://blog.csdn.net/weixin_42571280/article/details/141650739

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84316.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84316.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84316.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AIGC 基礎篇 Python基礎 04 for循環與while循環

今天&#xff0c;我們來講Python里面的循環部分 1.for循環 for i in range(1,10,2):print(i) 這是一個簡單但是完整的for循環&#xff0c;里面包含了for循環的所有結構 首先注意格式是“for 變量 in range(取得到的起始值&#xff0c;取不到的終點值&#xff0c;步長)” …

安寶特方案丨XRSOP人員作業標準化管理平臺:AR智慧點檢驗收套件

在選煤廠、化工廠、鋼鐵廠等過程生產型企業&#xff0c;其生產設備的運行效率和非計劃停機對工業制造效益有較大影響。 隨著企業自動化和智能化建設的推進&#xff0c;需提前預防假檢、錯檢、漏檢&#xff0c;推動智慧生產運維系統數據的流動和現場賦能應用。同時&#xff0c;…

每日算法 -【Swift 算法】三數之和最接近目標值

?? Swift 實現:三數之和最接近目標值(3Sum Closest) ? 前言 在算法學習過程中,經典的“三數之和”系列題目是很多人通往進階路上的一道坎。今天我們來介紹其中一個非常實用的變種問題 —— 三數之和最接近目標值(3Sum Closest),并使用 Swift 實現一個高效的解法。 …

python打卡day50@浙大疏錦行

知識點回顧&#xff1a; resnet結構解析CBAM放置位置的思考針對預訓練模型的訓練策略 差異化學習率三階段微調 ps&#xff1a;今日的代碼訓練時長較長&#xff0c;3080ti大概需要40min的訓練時長 作業&#xff1a; 好好理解下resnet18的模型結構嘗試對vgg16cbam進行微調策略 R…

虛幻引擎5-Unreal Engine筆記之SET節點的輸出引腳獲取設置后的最新變量值

虛幻引擎5-Unreal Engine筆記之SET節點的輸出引腳獲取設置后的最新變量值 code review! 一個變量的“SET”節點 retrieve 是動詞&#xff0c;意思是“檢索、獲取、取回”。 retrieves 只是當主語是第三人稱單數&#xff08;比如 he、she、it 或單個人/物&#xff09;時使用的…

編譯原理實驗 之 TINY 解釋測試目標代碼

文章目錄 實驗任務1任務2 本次的實驗是在前三次TINYC的基礎上的一個測試&#xff0c;所以完成前三次的實驗是基礎 編譯原理 之 實驗一 編譯原理實驗 之 Tiny C語言編譯程序實驗 語法分析 編譯原理實驗 之 TINY 之 語義分析&#xff08;第二次作業 首先將新的文件復制到先前的…

CanFestival移植到STM32G4

文章目錄 一、準備工作二、軟件配置三、移植CanFestival參考 一、準備工作 1、獲取Canfestival源碼 2、Python下載 3、wxPython下載 4、CanFestival字典生成 5、安裝參考 Python2.7.15及wxPython2.8百度云盤下載地址&#xff1a;https://pan.baidu.com/s/1bRS403m4B31m4ovSJ-_…

iOS性能調優實戰:借助克魔(KeyMob)與常用工具深度洞察App瓶頸

在日常iOS開發過程中&#xff0c;性能問題往往是最令人頭疼的一類Bug。尤其是在App上線前的壓測階段或是處理用戶反饋的高發期&#xff0c;開發者往往需要面對卡頓、崩潰、能耗異常、日志混亂等一系列問題。這些問題表面上看似偶發&#xff0c;但背后往往隱藏著系統資源調度不當…

第十三章 RTC 實時時鐘

第十三章 RTC 實時時鐘 目錄 第十三章 RTC 實時時鐘 1 RTC簡介 1.1 主要特性 2 功能描述 2.1 概述 2.2 復位過程 2.3 讀RTC寄存器 2.4 配置RTC寄存器 2.5 RTC標志的設置 3 RTC寄存器描述 3.1 RTC控制寄存器高位(RTC_CRH) 3.2 RTC控制寄存器低位(RTC_CRL) 3.3 RTC預…

618來了,推薦京東云服務器

2核2G3M,49元/1年,348元/3年 2核4G5M,149元/1年,518元/3年 4核8G5M,368元/1年,1468元/3年 8核16G5M,1258元/1年,3498元/3年 8核32G10M,1498元/1年,4268元/3年 活動地址&#xff1a;https://3.cn/2hT-F6AX

數據庫邏輯刪除,唯一性約束究極解決方案

文章目錄 一、寫在前面二、解決方案1、業務邏輯層面控制2、物理刪除數據歸檔3、is_delete !0的都認為是刪除&#xff08;推薦&#xff09;4、MySQL 函數索引&#xff08;表達式索引&#xff09;&#xff08;需 MySQL 8.0&#xff09;&#xff08;推薦&#xff09;5、部分索引&a…

3-存儲系統

一-基本概念 二-主存儲器 三-主存儲器與CPU的連接 四-外部存儲器 五-高速緩沖存儲器 六-虛擬存儲器

華為0528筆試

第三題 題目 給定一個二維數組 mountainMap 表示一座山的地圖&#xff0c;數組中的每個元素 mountainMap[x][y] 代表坐標 (x, y) 處山的高度。登山員從山底出發&#xff0c;爬到山峰。 山底的含義&#xff1a;mountainMap中高度為0的坐標點。 山峰的含義&#xff1a;mountain…

Redis的過期策略和淘汰策略

Redis的過期策略和淘汰策略 想象一下周末的大型超市&#xff1a;生鮮區的酸奶貼著"今日特價"標簽&#xff0c;促銷員定時檢查這些商品的保質期&#xff1b;而倉庫管理員正根據"先進先出"原則整理貨架&#xff0c;確保商品不會過期積壓。這種高效的商品管理…

laravel8+vue3.0+element-plus搭建方法

創建 laravel8 項目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安裝 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …

【HarmonyOS 5】 影視與直播詳以及 開發案例

&#x1f3a5; ?一、超高清低延遲直播? ?4K/8K硬解能力?&#xff1a;通過鴻蒙媒體引擎實現15Mbps碼率視頻流穩定解碼&#xff0c;華為Pura X實測端到端延遲<80ms?分布式渲染?&#xff1a;支持手機拍攝→智慧屏導播→平板監看的工作流協同&#xff0c;設備間傳輸延遲&…

Tunna工具實戰:基于HTTP隧道的RDP端口轉發技術

工具概述 Tunna是一款利用HTTP/HTTPS隧道進行TCP通信的滲透測試工具&#xff0c;由SECFORCE團隊開發并開源。該工具主要應用于需要繞過防火墻限制的場景&#xff0c;通過Webshell實現內網服務的端口轉發&#xff0c;特別適合在僅開放80/443端口的環境中建立TCP連接。 項目地址…

c# Autorest解析

AutoRest 工具生成用于訪問 RESTful Web 服務的客戶端庫。AutoRest 的輸入是使用 OpenAPI 規范格式描述 REST API 的規范。OpenAPI(f.k.a Swagger)規范代碼生成器。支持 C#、PowerShell、Go、Java、Node.js、TypeScript、Python。 安裝 AutoRest 在 Windows、MacOS 或 Linux …

高中數學聯賽模擬試題精選學數學系列第24套幾何題

⊙ O 1 \odot O_1 ⊙O1? 和 ⊙ O 2 \odot O_2 ⊙O2? 交于 A A A, B B B. Y Y Y 是 ⊙ O 1 \odot O_1 ⊙O1? 上一點, Z Z Z 是 ⊙ O 2 \odot O_2 ⊙O2? 上一點&#xff0c; Y Z YZ YZ 通過 A A A. 過 Y Y Y 的 ⊙ O 1 \odot O_1 ⊙O1? 的切線和過 Z Z Z 的 ⊙…

【QT】INI格式文件讀寫類IniApi封裝

【QT】INI文件讀寫類IniApi封裝 前言實現INI文件寫入方法INI文件讀取方法 測試 前言 INI格式文件是一種純文本格式&#xff0c;使用方括[]定義節&#xff08;Section&#xff09;&#xff0c;每個節下包含鍵值對&#xff0c;如下圖所示。該格式文件簡單易讀易編輯。而且在所有…