【MySQL】觸發器與存儲引擎

目錄

  • 觸發器
    • 基本概念
    • 觸發器操作
      • 創建觸發器
      • NEW 與 OLD
      • 查看觸發器
      • 刪除觸發器
    • 注意事項
  • 存儲引擎
    • 基本概念
    • 基本操作
      • 查詢當前數據庫支持的存儲引擎
      • 查看當前的默認存儲引擎
      • 查看某個表用的存儲引擎
      • 創建表時指定存儲引擎
      • 修改表的存儲引擎

觸發器

基本概念

概述:

  • 觸發器,就是一種特殊的存儲過程。觸發器和存儲過程一樣是一個能夠完成特定功能、存儲在數據庫服務器上的 SQL 片段,但是觸發器無需調用,當對數據庫表中的數據執行 DML 操作時自動觸發這個 SQL 片段的執行,無需手動條用
  • 在 MySQL 中,只有執行 insert,delete,update 操作時才能觸發觸發器的執行
  • 觸發器的這種特性可以協助應用在數據庫端確保數據的完整性,日志記錄,數據校驗等操作
  • 使用別名 OLD 和 NEW 來引用觸發器中發生變化的記錄內容,這與其他的數據庫是相似的。現在觸發器還只支持行級觸發,不支持語句級觸發

觸發器特點:

  • 什么條件會觸發?insert、delete、update
  • 什么時候觸發?在增刪改前或者后
  • 觸發頻率:針對每一行執行
  • 觸發器定義在表上,附著在表上

觸發器操作

創建觸發器

創建單執行語句的觸發器

格式如下:

create trigger 觸發器名 before|after 觸發事件
on 表名 for each row
執行語句;

創建多執行語句的觸發器

格式如下:

create trigger 觸發器名 before|after 觸發事件
on 表名 for each row
begin執行語句列表
end;

代碼示例:

-- 用戶表
create table user(uid int primary key ,username varchar(50) not null ,password varchar(50) not null
);-- 用戶信息操作日志
create table user_logs(id int primary key auto_increment ,time timestamp ,log_text varchar(255)
);-- 定義觸發器
create trigger trigger1 after inserton user for each rowinsert into user_logs values (null,now(),'有新用戶添加');-- 在user表中添加數據
insert into user values (1,'張三','123456');

結果如下:

在這里插入圖片描述

NEW 與 OLD

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

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

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

代碼示例:

-- 用戶表
create table user(uid int primary key ,username varchar(50) not null ,password varchar(50) not null
);-- 用戶信息操作日志
create table user_logs(id int primary key auto_increment ,time timestamp ,log_text varchar(255)
);-- 定義insert觸發器
create trigger trigger2 after inserton user for each rowinsert into user_logs values(null,now(),concat('有新用戶添加,信息為:',new.uid,new.username,new.password));-- 在user表中添加數據
insert into user values (1,'張三','123456'),(2,'李四','123456'),(3,'王五','123456'),(4,'趙六','123456');-- 定義update觸發器
create trigger trigger3 after updateon user for each rowinsert into user_logs values(null,now(),concat('有用戶修改,修改前的信息為:',old.uid,old.username,old.password));
create trigger trigger4 after updateon user for each rowinsert into user_logs values(null,now(),concat('有用戶修改,修改后的信息為:',new.uid,new.username,new.password));-- 修改user表中的數據
update user set password='234567' where uid=2;-- 定義delete觸發器
create trigger trigger5 after deleteon user for each rowinsert into user_logs values(null,now(),concat('有用戶刪除,刪除前的信息為:',old.uid,old.username,old.password));-- 刪除user表中的數據
delete from user where uid=3;

結果如下:

在這里插入圖片描述

查看觸發器

格式如下:

show triggers;

代碼示例:

show triggers;

結果如下:

在這里插入圖片描述

刪除觸發器

格式如下:

drop trigger [if exists] trigger_name;

代碼示例:

drop trigger if exists trigger2;
show triggers;

結果如下:

在這里插入圖片描述

注意事項

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

盡量少使用觸發器,假設觸發器觸發每次執行 1s,添加 500 條數據就要觸發 500 次觸發器,就會導致效率變低

觸發器是針對每一行的,對增刪改非常頻繁的表上不要使用觸發器,會非常消耗資源

存儲引擎

基本概念

概述:

  • 數據庫存儲引擎是數據庫底層軟件組織,數據庫管理系統(DBMS)使用數據引擎進行創建、查詢、更新和刪除數據
  • 不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能。現在許多不同的數據庫管理系統都支持多種不同的數據引擎。MySQL 的核心就是存儲引擎
  • 用戶可以根據不同的需求為數據表選擇不同的存儲引擎
  • 可以使用 SHOW ENGINES 命令可以查看 MySQL 的所有執行引擎,我們可以到默認的執行引擎是 InnoDB,支持事務,行級鎖定和外鍵

分類:

  • MyISAM:MySQL 5.5 之前的默認數據庫引擎,最為常用。擁有較高的插入,查詢速度,但不支持事務
  • InnoDB:事務型場景的首選引擎,支持 ACID 事務,支持行級鎖定,MySQL 5.5 成為默認數據庫引擎
  • Memory:所有數據置于內存的存儲引擎,擁有極高的插入、更新和查詢效率,但會占用與數據量成正比的內存空間,且內容在 MySQL 重新啟動時會丟失
  • Archive:非常適合存儲大量獨立的歷史記錄數據(因不經常被讀取),擁有高效的插入速度,但對查詢的支持相對較差
  • Federated:將不同的 MySQL 服務器聯合起來,邏輯上組成一個完整的數據庫,非常適合分布式應用
  • CSV:邏輯上由逗號分割數據的存儲引擎。它會在數據庫子目錄里為每個數據表創建一個 .csv 文件。這是一種普通文本文件,每個數據行占用一個文本行。CSV 存儲引擎不支持索引。
  • BlackHole:黑洞引擎,寫入的任何數據都會消失,一般用于記錄 binlog 做復制的中繼。
  • ERFORMANCE_SCHEMA:存儲引擎,該引擎主要用于收集數據庫服務器性能參數。
  • Mrg_Myisam Merge:存儲引擎,是一組 MyIsam 的組合,即將 MyIsam 引擎的多個表聚合起來,其內部沒有數據,真正的數據仍在 MyIsam 引擎的表中,但可直接進行查詢、刪除、更新等操作。

常用引擎對比:

功能MyISAMMEMORYInnoDB
存儲限制256TBRAM64TB
支持事務NoNoYes
支持全文索引YesNoNo
支持 B 樹索引YesYesYes
支持哈希索引NoYesNo
支持集群索引NoNoYes
支持數據索引YesYesYes
支持數據壓縮YesNoNo
空間使用率N/A
支持外鍵NoNoYes

基本操作

查詢當前數據庫支持的存儲引擎

代碼示例:

show engines;

結果如下:

在這里插入圖片描述

查看當前的默認存儲引擎

代碼示例:

show variables like '%storage_engine%';

結果如下:

在這里插入圖片描述

查看某個表用的存儲引擎

格式如下:

show create table table_name;

代碼示例:

create table student(id int ,name varchar(20)
);
show create table student;

結果如下:

在這里插入圖片描述

創建表時指定存儲引擎

格式如下:

create table table_name(...) engine = engine_name;

代碼示例:

create table teacher(id int ,name varchar(20)
) engine = MyISAM;
show create table teacher;

結果如下:

在這里插入圖片描述

修改表的存儲引擎

格式如下:

alter table table_name engine = engine_name;

代碼示例:

alter table teacher engine = InnoDB;
show create table teacher;

結果如下:

在這里插入圖片描述

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

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

相關文章

能“嘎嘎提升”提升用戶居住體驗的智能家居物聯網框架推薦!

智能家居在日常生活中給我們的帶來了更多的便利,更讓有些用戶切實地體會到了科技的魅力,對于想要打造屬于自己的智能家居氛圍感的用戶們,以下是一些能夠幫助提升居住體驗的智能家居物聯網框架及應用: 1. 涂鴉智能(Tuy…

DevEco Studio的使用

目錄 1.創建ArkTS工程 2.ArkTS工程目錄結構(Stage模型) 構建第一個頁面 構建第二個頁面 實現頁面間的跳轉 1.創建ArkTS工程 若首次打開DevEco Studio,請點擊Create Project創建工程。如果已經打開了一個工程,請在菜單欄選擇…

性能監控——vmstat

性能監控——vmstat ? 性能監控是對 IT 系統運行效率和有效性的系統觀察和測量。它涉及收集、分析和報告各種組件(包括應用程序、網絡、服務器和數據庫)的關鍵性能指標 (KPI)。此過程使用專門的工具來跟蹤響應時間、吞吐量、資源利用率和錯誤率等指標。…

搭建Python量化開發環境:從零開始的完整指南

搭建Python量化開發環境:從零開始的完整指南 在量化投資領域,一個穩定且高效的開發環境是成功的關鍵。本文將引導你一步步搭建起自己的Python量化開發環境,確保你能夠順利開始編寫和運行量化策略。 🚀量化軟件開通 &#x1f68…

圖像分割的mask有空洞怎么修補

分享一個對實例分割mask修補的方法,希望對大家有所幫助。 1. 這是我準備分割的圖片 2 分割結果 可以看到衣服部分有一些沒分割出來,二值化圖片能清晰看到衣服部分有些黑色未分出的地方。 3 補全mask區域 import cv2 import numpy as npdef fill_mask_h…

Qt 控件概述 QLabel

目錄 QLabel顯示類控件 label如何做到與窗口同步變化 邊框 Frame QLabel顯示類控件 ?? ?? textFormat :設置文件格式 ? Pixmap :標簽圖片 label如何做到與窗口同步變化 Qt中對應用戶的操作 : 事件和信號 拖拽窗口大小就會觸發…

詞頻統計 ccf-csp 2024-2-1

在學習了文本處理后,小 P 對英語書中的 n篇文章進行了初步整理。 具體來說,小 P將所有的英文單詞都轉化為了整數編號。 假設這 n 篇文章中共出現了 m個不同的單詞,則把它們從 1到 m進行編號。 這樣,每篇文章就簡化為了一個整數…

用爬蟲解鎖 Shopee 店鋪商品數據,開啟電商新洞察

在電商競爭白熱化的當下,Shopee 作為全球知名的電商平臺,匯聚了海量的商品與商機。對于電商從業者、數據分析師、創業者來說,精準掌握 Shopee 店鋪的商品信息,就如同手握一把開啟財富大門的鑰匙。而爬蟲技術,無疑是幫助…

k8s中的service解析

k8s中的service解析 在k8s中,我們可以通過pod來創建服務。 然而,當我們創建多個 Pod 來提供同一項服務時,直接通過 Pod IP 進行訪問會變得復雜且不可維護。因此,Kubernetes 提供了 Service 這一抽象概念,用于對外暴露…

git 命令回退版本

1、查看提交記錄 git log --oneline # 簡化的提交歷史&#xff08;推薦&#xff09; # 或 git log # 完整提交歷史2、版本回退 git reset --hard <commit-hash>3、如果已推送過代碼到遠程倉庫&#xff0c;需強制推送更新 git push -f

深度學習與傳統算法在人臉識別領域的演進:從Eigenfaces到ArcFace

一、傳統人臉識別方法的發展與局限 1.1 Eigenfaces&#xff1a;主成分分析的經典實踐 算法原理 Eigenfaces是基于主成分分析&#xff08;PCA&#xff09;的里程碑式方法。其核心思想是將人臉圖像視為高維向量&#xff0c;通過協方差矩陣計算特征向量&#xff08;即特征臉&…

串口接收不到數據,串口RX配置(f407),f103和f407的區別

問題 芯片&#xff1a;STM32F407&#xff0c;軟件&#xff1a;標準庫 使用串口時&#xff0c;直接把之前STM32F103的串口配置移植過來&#xff0c;同樣以串口4為例&#xff0c;代碼如下&#xff1a; STM32F103 UART4&#xff1a; void UART4_Configuration(uint32_t BaudRa…

淺分析 PE3R 感知高效的三維重建

"近期&#xff0c;二維到三維感知技術的進步顯著提升了對二維圖像中三維場景的理解能力。然而&#xff0c;現有方法面臨諸多關鍵挑戰&#xff0c;包括跨場景泛化能力有限、感知精度欠佳以及重建速度緩慢。為克服這些局限&#xff0c;我們提出了感知高效三維重建框架&#…

存算一體與存算分離:架構設計的深度解析與實現方案

隨著數據量的不斷增大和對計算能力的需求日益提高&#xff0c;存算一體作為一種新型架構設計理念&#xff0c;在大數據處理、云計算和人工智能等領域正逐步引起廣泛關注。在深入探討存算一體之前&#xff0c;我們需要先了解存儲和計算的基本概念&#xff0c;以及存算分離和存算…

匯編與反匯編:DEBUG 命令使用指南

前言 匯編語言是計算機底層編程語言&#xff0c;直接與 CPU 指令集對應。掌握匯編語言和調試工具&#xff08;如DEBUG&#xff09;是深入理解計算機工作原理的關鍵。本文將介紹匯編與反匯編的基本概念&#xff0c;并詳細講解如何使用 DEBUG 命令進行調試和內存操作。 目錄 一、…

數據分析的12個挑戰及其解決方法

俗話說得好“說起來容易做起來難。”數據分析對于風險管理者是極為重要的。我們可以利用數據分析結論&#xff0c;來為企業決策做有效協助&#xff0c;幫助企業改善財務狀況&#xff0c;提升企業業務銷售水平&#xff0c;幫助員工預測可能發生的問題&#xff0c;并協助監控企業…

棧/堆/static/虛表

在 C 里&#xff0c;棧空間主要用來存放局部變量、函數調用信息等。下面為你介紹棧空間在 C 里的運用方式。 1. 局部變量的使用 在函數內部定義的變量會被存于棧空間&#xff0c;當函數執行結束&#xff0c;這些變量會自動被銷毀。 #include <iostream>void exampleFu…

Vue keepalive學習用法

在Vue中&#xff0c;<keep-alive>的include屬性用于指定需要緩存的組件&#xff0c;其實現方式如下&#xff1a; 1. 基本用法 ? 字符串形式&#xff1a;通過逗號分隔組件名稱&#xff0c;匹配到的組件會被緩存。 <keep-alive include"ComponentA,ComponentB&…

搭建個人博客教程(Hexo)

如何快速搭建一套本地的博客系統呢&#xff1f;這里有一套gitNode.jsHexo的部署方案來進行解決。 安裝git Git 是一款免費開源的分布式版本控制系統&#xff0c;由 Linus Torvalds 于 2005 年為 Linux 內核開發設計。它通過本地倉庫和遠程倉庫實現代碼管理&#xff0c;支持分支…

手撕算法之`vector` 擴容、`string` 分割、鏈表翻轉

手寫常見操作:vector 擴容、string 分割、鏈表翻轉 (一)vector擴容 在 C++ 中,vector 的擴容機制是動態數組實現的核心特性,直接關系到性能和內存使用效率。以下是深入剖析: 1. 擴容觸發條件 vector<int> v; v.push_back(1); // 當 size() == capacity() 時觸發…