1. 程式人生 > >什麼是觸發器(mysql),它的利與弊,使用例項

什麼是觸發器(mysql),它的利與弊,使用例項

轉載至:https://www.cnblogs.com/zyshi/p/6618839.html#_label3(個人總結:下面內容已經驗證了,程式碼例項沒有問題。觸發器只是用在特定的場合,一般情況下,我們還是在程式碼中處理,因為同一個業務邏輯中,如果程式碼和sql中都有業務邏輯,那麼後期維護將很麻煩,所以要根據實際情況來選擇,看是否合適。觸發器就是寫在資料庫中的一個指令碼sql,當資料庫某一個欄位發生改變的時候,觸發一個或多條sql語句,同時讓多張表的資料同步。比如我們有的表中存放了部門名稱,那麼當我們部門名稱發生改變的時候,我們應該呼叫觸發器同時去修改存放了“部門名稱”這個冗餘欄位。)

什麼是觸發器

簡單的說,就是一張表發生了某件事(插入、刪除、更新操作),然後自動觸發了預先編寫好的若干條SQL語句的執行;

特點及作用

特點:觸發事件的操作和觸發器裡的SQL語句是一個事務操作,具有原子性,要麼全部執行,要麼都不執行;

作用:保證資料的完整性,起到約束的作用;

例子:建立觸發器,記錄表的增、刪、改操作記錄

接下來將建立user和user_history表,以及三個觸發器tri_insert_user、tri_update_user、tri_delete_user,分別對應user表的增、刪、改三件事;

  • 建立user表;
按 Ctrl+C 複製程式碼按 Ctrl+C 複製程式碼
  • 建立對user表操作歷史表;
複製程式碼複製程式碼
DROP TABLE IF EXISTS `user_history`;
CREATE TABLE `user_history` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NOT NULL,
  `operatetype` varchar(200) NOT NULL,
  `operatetime` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
複製程式碼複製程式碼
  • 建立user表插入事件對應的觸發器tri_insert_user;

幾點說明:

DELIMITER:改變輸入的結束符,預設情況下輸入結束符是分號;,這裡把它改成了兩個分號;;,這樣做的目的是把多條含分號的語句做個封裝,全部輸入完之後一起執行,而不是一遇到預設的分號結束符就自動執行;

new:當觸發插入和更新事件時可用,指向的是被操作的記錄

old: 當觸發刪除和更新事件時可用,指向的是被操作的記錄

複製程式碼複製程式碼
DROP TRIGGER IF EXISTS `tri_insert_user`;
DELIMITER ;;
CREATE TRIGGER `tri_insert_user` AFTER INSERT ON `user` FOR EACH ROW begin
    INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (new.id, 'add a user',  now());
end
;;
DELIMITER ;
複製程式碼複製程式碼
  • 建立user表更新事件對應的觸發器tri_update_user;
複製程式碼複製程式碼
DROP TRIGGER IF EXISTS `tri_update_user`;
DELIMITER ;;
CREATE TRIGGER `tri_update_user` AFTER UPDATE ON `user` FOR EACH ROW begin
    INSERT INTO user_history(user_id,operatetype, operatetime) VALUES (new.id, 'update a user', now());
end
;;
DELIMITER ;
複製程式碼複製程式碼
  • 建立user表刪除事件對應的觸發器tri_delete_user;
複製程式碼複製程式碼
DROP TRIGGER IF EXISTS `tri_delete_user`;
DELIMITER ;;
CREATE TRIGGER `tri_delete_user` AFTER DELETE ON `user` FOR EACH ROW begin
    INSERT INTO user_history(user_id, operatetype, operatetime) VALUES (old.id, 'delete a user', now());
end
;;
DELIMITER ;
複製程式碼複製程式碼
  • 至此,全部表及觸發器建立完成,開始驗證結果,分別做插入、修改、刪除事件,執行以下語句,觀察user_history是否自動產生操作記錄;
INSERT INTO user(account, name, address) VALUES ('user1', 'user1', 'user1');
INSERT INTO user(account, name, address) VALUES ('user2', 'user2', 'user2');

UPDATE user SET name = 'user3', account = 'user3', address='user3' where name='user1';

DELETE FROM `user` where name = 'user2';
  • 觀察結果user表和user_history表的結果,操作記錄已產生,說明觸發器工作正常;

弊端

增加程式的複雜度,有些業務邏輯在程式碼中處理,有些業務邏輯用觸發器處理,會使後期維護變得困難;

相關推薦

什麼是觸發器mysql使用例項

轉載至:https://www.cnblogs.com/zyshi/p/6618839.html#_label3(個人總結:下面內容已經驗證了,程式碼例項沒有問題。觸發器只是用在特定的場合,一般情況下,我們還是在程式碼中處理,因為同一個業務邏輯中,如果程式碼和sql中都有業務

IT輪子系列——Excel上傳解析一套代碼解決所有Excel業務上傳你Get到了嗎

tryparse mappath src 個推 列名 import ges bject tab 前言 在日常開發當中,excel的上傳與解析是很常見的。根據業務不同,解析的數據模型也都不一樣。不同的數據模型也就需要不同的校驗邏輯,這往往需要寫多套的代碼進行字段的檢驗,如必填

資料視覺化 三步走:資料採集儲存利用python爬蟲框架scrapy爬取網路資料並存儲

前言     最近在研究python爬蟲,突然想寫部落格了,那就寫點東西吧。給自己定個小目標,做一個完整的簡單的資料視覺化的小專案,把整個相關技術鏈串聯起來,目的就是為了能夠對這塊有個系統的認識,具體設計思路如下: 1. 利用python爬蟲框架scr

訊息中介軟體——RabbitMQ快速入門生產者消費者SpringBoot整合RabbitMQ!

前言 本章我們來一次快速入門RabbitMQ——生產者與消費者。需要構建一個生產端與消費端的模型。什麼意思呢?我們的生產者傳送一條訊息,投遞到RabbitMQ叢集也就是Broker。 我們的消費端進行監聽RabbitMQ,當發現佇列中有訊息後,就進行消費。 1. 環境準備 本次整合主要採用Spring

centos 安裝oracle 11g r2-----監聽配置建立資料庫例項

一、監聽配置(命令:netca) 1、以 oracle 使用者輸入命令,啟動圖形化工具配置監聽 [[email protected] ~]$ netca 2、選擇==++Add++== 3、預設監聽名稱,直接下一步 二、建立資料庫例項(命令:dbca)-----需要確

PL/SQL 編程程序包和包體觸發器視圖索引

rep upd 索引 itl 數據檢索 一鍵 代碼 dep pl/sql conn scott/tiger; grant insert,update,delete on emp to system; conn system/orcl1234; create or

MySQLOracle---日期對比MySQL

val replace nbsp rac oracl 日期 align mysql datetime MySQL與Oracle的日期函數對比(一) 一、SQL 短日期格式:yyyy-m-d SELECT REPLACE(CONVERT(varchar(10),getda

Mysql加鎖過程詳解9-innodb下的記錄鎖間隙鎖next-key鎖

ans 唯一索引 crazy cimage -h insert tran 存在 gin Mysql加鎖過程詳解(1)-基本知識 Mysql加鎖過程詳解(2)-關於mysql 幻讀理解 Mysql加鎖過程詳解(3)-關於mysql 幻讀理解 Mysql加鎖過程詳解(4)-

5、安裝配置MySQL

ubun register oot local sock www sans res state 最後當然還有我們的MySQL啦(遇選擇請選“Y”) root@ubuntu:/# sudo apt-get install mysql-server 漫長的等待之後,我的界面

Kafka:ZK+Kafka+Spark Streaming集群環境搭建VMW安裝四臺CentOS並實現本機它們能交互虛擬機內部實現可以上網。

centos 失敗 sco pan html top n 而且 div href Centos7出現異常:Failed to start LSB: Bring up/down networking. 按照《Kafka:ZK+Kafka+Spark Streaming集群環

C++ 學習筆記 繼承- 子類父類有同名函數變量

pan end main函數 類繼承 class 分享圖片 共享 code 訪問   學習了類的繼承,今天說一下當父類與子類中有同名函數和變量時那麽程序將怎麽執行。首先明確當基類和子類有同名函數或者變量時,子類依然從父類繼承。   舉例說明:         例

LinuxCentos7阿帕奇Apache伺服器的安裝配置

Y6   Apache是世界使用排名第一的Web伺服器軟體。它可以執行在幾乎所有廣泛使用的計算機平臺上,由於其跨平臺和安全性被廣泛使用,是最流行的Web伺服器端軟體之一。它快速、可靠並且可通過簡單的API擴充,將Perl/Python等直譯器編譯到伺服器中。 下面介紹Apac

sql mysql實現查詢某一個經緯度周圍500米距離的餐館資料庫存放所有餐館的經緯度。

mysql兩點間距,公式如下,單位米:第一點經緯度:lng1 lat1第二點經緯度:lng2 lat2round(6378.138*2*asin(sqrt(pow(sin((lat1*pi()/180-lat2*pi()/180)/2),2)+cos(lat1*pi()/180)*cos(lat2*

演算法優化1:基礎知識-凸集單峰函式擬凸函式凸函式函式凹凸性定義

本文筆記介紹我最近學習的演算法優化的基礎知識,有: 最優化問題的一般形式 約束問題的分類及形式 優化問題的分類 單峰函式(Unimodal function)的定義 擬凸函式(Quasiconvex function)的定義

一次血的教訓阿里雲rds mysql 資料庫本地化並日志恢復已刪除的兩天資料

原文連結 參考阿里雲幫助文件 案例背景,勿刪公司線上資料庫使用者表(阿里去rds mysql),情急之下,將其恢復至最近備份(兩天前,阿里雲自動備份策略),恢復完後的第二天發現,備份與刪庫期間有些資料是重要且有用的,於是領導強烈希望能恢復期間資料,以減少公司損失,

PostgreSQL觸發器語句級觸發器行級觸發器

    PostgreSQL中的觸發器可以分為:語句級觸發器與行級觸發器。     先說結論:語句級觸發器指執行每個SQL時,只執行一次 ;行級觸發器指每行都會執行一次。     下文會通過例項分別介紹這兩種觸發器。建立一張學生表和日誌表,在日誌表中記錄對學生表的操作(插

linux上資料庫匯入匯出mysql

匯入資料庫 1.建立資料庫。  create database stillmealdbs; 2.linux下檢視Mysql預設編碼、修改預設編碼 檢視MySQL資料庫的預設編碼        1使用status

MySQL索引----BTREE 索引 HASH 索引

MEMORY 儲存引擎的表可以選擇使用 BTREE 索引或者 HASH 索引,兩種不同型別的索引 各有其不同的適用範圍。HASH 索引有一些重要的特徵需要在使用的時候特別注意,如下所 示 只用於使用=或<=>操作符的等式比較。(=跟<=>的區別,主要是,<=&

卷積神經網路CNN1——影象卷積反捲積後卷積轉置卷積

1.前言    傳統的CNN網路只能給出影象的LABLE,但是在很多情況下需要對識別的物體進行分割實現end to end,然後FCN出現了,給物體分割提供了一個非常重要的解決思路,其核心就是卷積與反捲積,所以這裡就詳細解釋卷積與反捲積。     對於1維的卷積,公式(離散

ssm中mybatis處理資料庫mysqlpojo屬性中型別不一致string轉date

        一般在表設計的時候會考慮到資料庫欄位型別和java中屬性一致的問題,但是也有可能會出現一些情況導致型別不一致的問題,比如:二次開發中需求更改等。此時資料庫和java中的程式碼不能隨便更改,所以考慮的思路是通過typeHandler作為中間體來把型別轉換。