什麼是觸發器(mysql),它的利與弊,使用例項
什麼是觸發器
簡單的說,就是一張表發生了某件事(插入、刪除、更新操作),然後自動觸發了預先編寫好的若干條SQL語句的執行;
特點及作用
特點:觸發事件的操作和觸發器裡的SQL語句是一個事務操作,具有原子性,要麼全部執行,要麼都不執行;
作用:保證資料的完整性,起到約束的作用;
例子:建立觸發器,記錄表的增、刪、改操作記錄
接下來將建立user和user_history表,以及三個觸發器tri_insert_user、tri_update_user、tri_delete_user,分別對應user表的增、刪、改三件事;
- 建立user表;
- 建立對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
MySQL與Oracle(二)---日期對比(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 訪問 學習了類的繼承,今天說一下當父類與子類中有同名函數和變量時那麽程序將怎麽執行。首先明確當基類和子類有同名函數或者變量時,子類依然從父類繼承。 舉例說明: 例
Linux(Centos7)下,阿帕奇(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 索引有一些重要的特徵需要在使用的時候特別注意,如下所 示 只用於使用=或<=>操作符的等式比較。(=跟<=>的區別,主要是,<=&
卷積神經網路CNN(1)——影象卷積與反捲積(後卷積,轉置卷積)
1.前言 傳統的CNN網路只能給出影象的LABLE,但是在很多情況下需要對識別的物體進行分割實現end to end,然後FCN出現了,給物體分割提供了一個非常重要的解決思路,其核心就是卷積與反捲積,所以這裡就詳細解釋卷積與反捲積。 對於1維的卷積,公式(離散
ssm中mybatis處理資料庫(mysql)與pojo屬性中型別不一致(string轉date)
一般在表設計的時候會考慮到資料庫欄位型別和java中屬性一致的問題,但是也有可能會出現一些情況導致型別不一致的問題,比如:二次開發中需求更改等。此時資料庫和java中的程式碼不能隨便更改,所以考慮的思路是通過typeHandler作為中間體來把型別轉換。