觸發器
一、介紹
觸發器是與表有關的資料庫物件,指在insert/update/delete之前或之后,觸發并執行觸發器中定義SQL陳述句集合,觸發器的這種特性可以協助應用在資料庫端確保資料的完整性,日志記錄,資料校驗等操作,
使用別 名OLD 和 NEW 來參考觸發器中發生變化的記錄內容,這與其他的資料庫是相似的,現在觸發器還只支持行級觸發,不支持陳述句級觸發,
| 觸發器型別 | NEW 和 OLD |
|---|---|
| INSERT型觸發器 | NEW 表示將要或者已經新增的資料型別 |
| UPDATE型觸發器 | OLD 表示修改之前的資料,NEW 表示將要修改或者已經修改后的資料 |
| DELETE型觸發器 | OLD 表示將要或者已經洗掉的資料 |
二、語法
-
創建
CREATE TRIGGER trigger_name BEFORE/AFTER INSERT/UPDATE/DELETE ON tbl_name FOR EACH ROW -- 行級觸發器 BEGIN trigger_stmt; END; -
查看
SHOW TRIGGERS; -
洗掉
DROP TRIGGER [schema_name.]trigger_name; -- 如果沒有指定schema_name,默認為當前資料庫,
代碼演示:
-- 觸發器
-- 準備作業:日志表 user_logs
CREATE TABLE user_logs(
id INT(11) NOT NULL auto_increment,
operation VARCHAR(20) NOT NULL COMMENT '操作型別,insert/update/delete',
operate_time datetime NOT NULL COMMENT '操作時間',
operate_empno INT(11) NOT NULL COMMENT '操作的empno',
operate_params VARCHAR(1000) COMMENT '操作引數',
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8;
-- 插入資料觸發器(insert)
CREATE TRIGGER emp_insert_trigger
AFTER INSERT ON emp FOR EACH ROW
BEGIN
INSERT INTO user_logs VALUES(null, 'insert', NOW(), new.empno, CONCAT('輸入的內容:',new.empno,new.ename, new.job, new.mgr,new.hiredate,new.sal,new.comm,new.deptno));
END;
-- 查看
SHOW TRIGGERS;
-- 洗掉
DROP TRIGGER emp_insert_trigger;
INSERT INTO emp VALUES(7800, 'TIM', 'SALESMAN',7902, '1980-12-15 00:00:00', 900, 1000, 20);
SELECT * FROM user_logs;
-- 修改資料觸發器(update)
CREATE TRIGGER emp_update_trigger
AFTER UPDATE ON emp FOR EACH ROW
BEGIN
INSERT INTO user_logs VALUES(null, 'update', NOW(), new.empno, CONCAT('更新之前的資料:','empno=',old.empno,'ename=',old.ename,'job=', old.job, 'mgr=',old.mgr,'hiredate=',old.hiredate,'sal=',old.sal,'comm=',old.comm,'deptno=',old.deptno,
'| 更新之后的資料:','empno=',new.empno,'ename=',new.ename,'job=', new.job, 'mgr=',new.mgr,'hiredate=',new.hiredate,'sal=',new.sal,'comm=',new.comm,'deptno=',new.deptno));
END;
SHOW TRIGGERS;
UPDATE emp SET sal = 1900 WHERE empno = 7800;
UPDATE emp SET sal = 1900 WHERE empno < 7800; -- empno < 7800 的記錄有幾條,就執行幾次觸發器
SELECT * FROM user_logs;
-- 洗掉資料的觸發器(delete)
CREATE TRIGGER emp_delete_trigger
AFTER DELETE ON emp FOR EACH ROW
BEGIN
INSERT INTO user_logs VALUES(null, 'delete', NOW(), old.empno, CONCAT('洗掉之前的資料:','empno=',old.empno,'ename=',old.ename,'job=', old.job, 'mgr=',old.mgr,'hiredate=',old.hiredate,'sal=',old.sal,'comm=',old.comm,'deptno=',old.deptno));
END;
SHOW TRIGGERS;
DELETE FROM emp WHERE empno = 7800;
SELECT * FROM user_logs;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/554251.html
標籤:其他
上一篇:04_深入淺出索引(上)
下一篇:返回列表
