一、MySQL触发器

  触发器是由MySQL的基本命令事件来触发某种特定操作,这些基本的命令由INSERT、UPDATE、DELETE等事件来触发某些特定操作。满足触发器的触发条件时,数据库系统就会自动执行触发器中定义的程序语句。这样可以令某些操作之间的一致性得到协调。

  1.创建MySQL触发器  

  1. mysql> CREATE TABLE IF NOT EXISTS tb_booklog(
  2. -> id int(11) PRIMARY KEY auto_increment NOT NULL,
  3. -> event varchar(200) NOT NULL,
  4. -> logtime timestamp NOT NULL DEFAULT current_timestamp
  5. -> );
  6. Query OK, 0 rows affected (0.03 sec)
  7.  
  8. mysql> DELIMITER //
  9. mysql> CREATE TRIGGER auto_save_log BEFORE INSERT
  10. -> ON tb_bookinfo FOR EACH ROW
  11. -> INSERT INTO tb_booklog(event,logtime) values('look at me',now());
  12. -> //
  13. Query OK, 0 rows affected (0.01 sec)
  1. mysql> SELECT * FROM tb_bookinfo;
  2. -> //
  3. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  4. | barcode | bookname | typeid | author | ISBN | price | page | bookcase | inTime | del | id |
  5. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  6. | 17120107 | Java King | 3 | LianJiang | 115 | 49.80 | 350 | 1 | 2018-04-17 | 0 | 1 |
  7. | 17120108 | Lian | 1 | QiaoJiang | 116 | 50.00 | 351 | 2 | 2018-04-18 | 0 | 2 |
  8. | 17120109 | Tian King | 2 | TianJiang | 117 | 51.10 | 352 | 3 | 2018-04-19 | 0 | 3 |
  9. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  10. 3 rows in set (0.00 sec)
  1. mysql> INSERT INTO tb_bookinfo
  2. -> (barcode,bookname,typeid,author,ISBN,price,page,bookcase,inTime,del,id)
  3. -> VALUES
  4. -> ('17120110','ShenOba',4,'ShenJiang','118',52.15,300,4,'2018-04-20',0,4);
  5. -> //
  6. Query OK, 1 row affected (0.00 sec)
  7.  
  8. mysql> SELECT * FROM tb_bookinfo;
  9. -> //
  10. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  11. | barcode | bookname | typeid | author | ISBN | price | page | bookcase | inTime | del | id |
  12. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  13. | 17120107 | Java King | 3 | LianJiang | 115 | 49.80 | 350 | 1 | 2018-04-17 | 0 | 1 |
  14. | 17120108 | Lian | 1 | QiaoJiang | 116 | 50.00 | 351 | 2 | 2018-04-18 | 0 | 2 |
  15. | 17120109 | Tian King | 2 | TianJiang | 117 | 51.10 | 352 | 3 | 2018-04-19 | 0 | 3 |
  16. | 17120110 | ShenOba | 4 | ShenJiang | 118 | 52.15 | 300 | 4 | 2018-04-20 | 0 | 4 |
  17. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  18. 4 rows in set (0.00 sec)
  19.  
  20. mysql> SELECT * FROM tb_booklog;
  21. -> //
  22. +----+------------+---------------------+
  23. | id | event | logtime |
  24. +----+------------+---------------------+
  25. | 2 | look at me | 2018-04-18 19:40:02 |
  26. +----+------------+---------------------+
  27. 1 row in set (0.00 sec)

  2.创建具有多个执行语句的触发器

  1. mysql> CREATE DEFINER=`root`@`localhost` TRIGGER delete_book_info BEFORE DELETE
  2. -> ON tb_bookinfo FOR EACH ROW
  3. -> BEGIN
  4. -> INSERT INTO tb_booklog(event,logtime) values('let me go',now());
  5. -> INSERT INTO tb_bookinfobak SELECT * FROM tb_bookinfo where id=OLD.id;
  6. -> END
  7. -> //
  8. Query OK, 0 rows affected (0.01 sec)

  血一般惨痛的教训!!!当删除表中某一条记录未能成功时,检查一下触发器什么的有没有INSERT INTO语句,如果有,检查插入值的个数和表能不能对应起来,这里的原因就是两个表不一致!!!

  1. Microsoft Windows [版本 10.0.16299.371]
  2. (c) 2017 Microsoft Corporation。保留所有权利。
  3.  
  4. C:\Users\BigJun>mysql -uroot -p
  5. Enter password: *********
  6. Welcome to the MySQL monitor. Commands end with ; or \g.
  7. Your MySQL connection id is 23
  8. Server version: 5.7.20 MySQL Community Server (GPL)
  9.  
  10. Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
  11.  
  12. Oracle is a registered trademark of Oracle Corporation and/or its
  13. affiliates. Other names may be trademarks of their respective
  14. owners.
  15.  
  16. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  17.  
  18. mysql> DELIMITER //
  19. mysql> CREATE DEFINER=`root`@`localhost` TRIGGER BEFORE DELETE
  20. -> ON tb_bookinfo FOR EACH ROW
  21. -> BEGIN
  22. -> INSERT INTO tb_booklog(event,logtime) values('let me go'.now());
  23. -> INSERT INTO tb_bookinfobak SELECT * FROM tb_bookinfo where id=OLD.id;
  24. -> END
  25. -> //
  26. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'BEFORE DELETE
  27. ON tb_bookinfo FOR EACH ROW
  28. BEGIN
  29. INSERT INTO tb_booklog(event,log' at line 1
  30. mysql> CREATE DEFINER=`root`@`localhost` TRIGGER delete_book_info BEFORE DELETE
  31. -> ON tb_bookinfo FOR EACH ROW
  32. -> BEGIN
  33. -> INSERT INTO tb_booklog(event,logtime) values('let me go'.now());
  34. -> INSERT INTO tb_bookinfobak SELECT * FROM tb_bookinfo where id=OLD.id;
  35. -> END
  36. -> //
  37. ERROR 1046 (3D000): No database selected
  38. mysql> use db_library;
  39. ERROR 1049 (42000): Unknown database 'db_library;'
  40. mysql> USE db_library;
  41. ERROR 1049 (42000): Unknown database 'db_library;'
  42. mysql> exit
  43. Bye
  44.  
  45. C:\Users\BigJun>mysql -uroot -p
  46. Enter password: *********
  47. Welcome to the MySQL monitor. Commands end with ; or \g.
  48. Your MySQL connection id is 24
  49. Server version: 5.7.20 MySQL Community Server (GPL)
  50.  
  51. Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.
  52.  
  53. Oracle is a registered trademark of Oracle Corporation and/or its
  54. affiliates. Other names may be trademarks of their respective
  55. owners.
  56.  
  57. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
  58.  
  59. mysql> show databases;
  60. +--------------------+
  61. | Database |
  62. +--------------------+
  63. | information_schema |
  64. | db_database13 |
  65. | db_library |
  66. | db_library1 |
  67. | db_library_gbk |
  68. | hotel |
  69. | mybatis |
  70. | mysql |
  71. | mysqldb |
  72. | performance_schema |
  73. | se |
  74. | spring |
  75. | springapp |
  76. | sys |
  77. | test |
  78. +--------------------+
  79. 15 rows in set (0.00 sec)
  80.  
  81. mysql> use db_library;
  82. Database changed
  83. mysql> DELIMITER //
  84. mysql> CREATE DEFINER=`root`@`localhost` TRIGGER delete_book_info BEFORE DELETE
  85. -> ON tb_bookinfo FOR EACH ROW
  86. -> BEGIN
  87. -> INSERT INTO tb_booklog(event,logtime) values('let me go'.now());
  88. ->
  89. -> INSERT INTO tb_bookinfobak SELECT * FROM tb_bookinfo where id=OLD.id;
  90. -> END
  91. -> //
  92. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.now());
  93.  
  94. INSERT INTO tb_bookinfobak SELECT * FROM tb_bookinfo where id=OLD.id;
  95. ' at line 4
  96. mysql> CREATE DEFINER=`root`@`localhost` TRIGGER delete_book_info BEFORE DELETE
  97. -> ON tb_bookinfo FOR EACH ROW
  98. -> BEGIN
  99. -> INSERT INTO tb_booklog(event,logtime) values('let me go'.now());
  100. -> INSERT INTO tb_bookinfobak SELECT * FROM tb_bookinfo where id=OLD.id;
  101. -> END
  102. -> //
  103. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.now());
  104. INSERT INTO tb_bookinfobak SELECT * FROM tb_bookinfo where id=OLD.id;
  105. E' at line 4
  106. mysql> CREATE DEFINER=`root`@`localhost` TRIGGER delete_book_info BEFORE DELETE
  107. -> ON tb_bookinfo FOR EACH ROW
  108. -> BEGIN
  109. -> INSERT INTO tb_booklog(event,logtime) values('let me go',now());
  110. -> INSERT INTO tb_bookinfobak SELECT * FROM tb_bookinfo where id=OLD.id;
  111. -> END
  112. -> //
  113. Query OK, 0 rows affected (0.01 sec)
  114.  
  115. mysql> select * from tb_bookinfo;
  116. -> //
  117. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  118. | barcode | bookname | typeid | author | ISBN | price | page | bookcase | inTime | del | id |
  119. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  120. | 17120107 | Java King | 3 | LianJiang | 115 | 49.80 | 350 | 1 | 2018-04-17 | 0 | 1 |
  121. | 17120108 | Lian | 1 | QiaoJiang | 116 | 50.00 | 351 | 2 | 2018-04-18 | 0 | 2 |
  122. | 17120109 | Tian King | 2 | TianJiang | 117 | 51.10 | 352 | 3 | 2018-04-19 | 0 | 3 |
  123. | 17120110 | ShenOba | 4 | ShenJiang | 118 | 52.15 | 300 | 4 | 2018-04-20 | 0 | 4 |
  124. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  125. 4 rows in set (0.01 sec)
  126.  
  127. mysql> select * from tb_booklog;
  128. -> //
  129. +----+------------+---------------------+
  130. | id | event | logtime |
  131. +----+------------+---------------------+
  132. | 2 | look at me | 2018-04-18 19:40:02 |
  133. +----+------------+---------------------+
  134. 1 row in set (0.00 sec)
  135.  
  136. mysql> select * from tb_bookinfobak;
  137. -> //
  138. Empty set (0.00 sec)
  139.  
  140. mysql> DELETE FROM tb_bookinfo where id=4;
  141. -> //
  142. ERROR 1136 (21S01): Column count doesn't match value count at row 1
  143. mysql> DELETE FROM tb_bookinfo WHERE id=4;
  144. -> //
  145. ERROR 1136 (21S01): Column count doesn't match value count at row 1
  146. mysql> DELETE FROM tb_bookinfo WHERE id=3;
  147. -> //
  148. ERROR 1136 (21S01): Column count doesn't match value count at row 1
  149. mysql> DELETE FROM tb_bookinfo WHERE barcode='17120107';
  150. -> //
  151. ERROR 1136 (21S01): Column count doesn't match value count at row 1
  152. mysql> show triggers;
  153. -> //
  154. +------------------+--------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
  155. | Trigger | Event | Table | Statement | Timing | Created | sql_mode | Definer | character_set_client | collation_connection | Database Collation |
  156. +------------------+--------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
  157. | delete_book_info | DELETE | tb_bookinfo | BEGIN
  158. INSERT INTO tb_booklog(event,logtime) values('let me go',now());
  159. INSERT INTO tb_bookinfobak SELECT * FROM tb_bookinfo where id=OLD.id;
  160. END | BEFORE | 2018-04-18 20:35:07.19 | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | root@localhost | gbk | gbk_chinese_ci | utf8_general_ci |
  161. +------------------+--------+-------------+--------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------+-------------------------------------------------------------------------------------------------------------------------------------------+----------------+----------------------+----------------------+--------------------+
  162. 1 row in set (0.00 sec)
  163.  
  164. mysql> select * from tb_bookinfo;
  165. -> //
  166. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  167. | barcode | bookname | typeid | author | ISBN | price | page | bookcase | inTime | del | id |
  168. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  169. | 17120107 | Java King | 3 | LianJiang | 115 | 49.80 | 350 | 1 | 2018-04-17 | 0 | 1 |
  170. | 17120108 | Lian | 1 | QiaoJiang | 116 | 50.00 | 351 | 2 | 2018-04-18 | 0 | 2 |
  171. | 17120109 | Tian King | 2 | TianJiang | 117 | 51.10 | 352 | 3 | 2018-04-19 | 0 | 3 |
  172. | 17120110 | ShenOba | 4 | ShenJiang | 118 | 52.15 | 300 | 4 | 2018-04-20 | 0 | 4 |
  173. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  174. 4 rows in set (0.00 sec)
  175.  
  176. mysql> delete from tb_bookinfo where id=1;
  177. -> //
  178. ERROR 1136 (21S01): Column count doesn't match value count at row 1
  179. mysql> desc tb_bookinfobak;
  180. -> //
  181. +------------+------------------+------+-----+---------+-------+
  182. | Field | Type | Null | Key | Default | Extra |
  183. +------------+------------------+------+-----+---------+-------+
  184. | barcode | varchar(30) | YES | | NULL | |
  185. | bookname | varchar(70) | YES | | NULL | |
  186. | typeid | int(10) unsigned | YES | | NULL | |
  187. | author | varchar(30) | YES | | NULL | |
  188. | ISBN | varchar(20) | YES | | NULL | |
  189. | price | float(8,2) | YES | | NULL | |
  190. | page | int(10) unsigned | YES | | NULL | |
  191. | bookcase | int(10) unsigned | YES | | NULL | |
  192. | inTime | datetime(6) | YES | | NULL | |
  193. | del | tinyint(1) | YES | | 0 | |
  194. | id | int(11) | NO | | NULL | |
  195. | translator | varchar(30) | NO | | NULL | |
  196. +------------+------------------+------+-----+---------+-------+
  197. 12 rows in set (0.00 sec)
  198.  
  199. mysql> alter table tb_bookinfobak drop transtor;
  200. -> //
  201. ERROR 1091 (42000): Can't DROP 'transtor'; check that column/key exists
  202. mysql> alter table tb_bookinfobak drop translator;
  203. -> //
  204. Query OK, 0 rows affected (0.04 sec)
  205. Records: 0 Duplicates: 0 Warnings: 0
  206.  
  207. mysql> desc tb_bookinfobak;
  208. -> //
  209. +----------+------------------+------+-----+---------+-------+
  210. | Field | Type | Null | Key | Default | Extra |
  211. +----------+------------------+------+-----+---------+-------+
  212. | barcode | varchar(30) | YES | | NULL | |
  213. | bookname | varchar(70) | YES | | NULL | |
  214. | typeid | int(10) unsigned | YES | | NULL | |
  215. | author | varchar(30) | YES | | NULL | |
  216. | ISBN | varchar(20) | YES | | NULL | |
  217. | price | float(8,2) | YES | | NULL | |
  218. | page | int(10) unsigned | YES | | NULL | |
  219. | bookcase | int(10) unsigned | YES | | NULL | |
  220. | inTime | datetime(6) | YES | | NULL | |
  221. | del | tinyint(1) | YES | | 0 | |
  222. | id | int(11) | NO | | NULL | |
  223. +----------+------------------+------+-----+---------+-------+
  224. 11 rows in set (0.00 sec)
  225.  
  226. mysql> desc tb_bookinfo;
  227. -> //
  228. +----------+------------------+------+-----+---------+-------+
  229. | Field | Type | Null | Key | Default | Extra |
  230. +----------+------------------+------+-----+---------+-------+
  231. | barcode | varchar(30) | YES | | NULL | |
  232. | bookname | varchar(70) | YES | | NULL | |
  233. | typeid | int(10) unsigned | YES | | NULL | |
  234. | author | varchar(30) | YES | | NULL | |
  235. | ISBN | varchar(20) | YES | | NULL | |
  236. | price | float(8,2) | YES | | NULL | |
  237. | page | int(10) unsigned | YES | | NULL | |
  238. | bookcase | int(10) unsigned | YES | | NULL | |
  239. | inTime | date | YES | | NULL | |
  240. | del | tinyint(1) | YES | | 0 | |
  241. | id | int(11) | NO | PRI | NULL | |
  242. +----------+------------------+------+-----+---------+-------+
  243. 11 rows in set (0.00 sec)
  244.  
  245. mysql> alter table tb_bookinfobak modify inTime date;
  246. -> //
  247. Query OK, 0 rows affected (0.04 sec)
  248. Records: 0 Duplicates: 0 Warnings: 0
  249.  
  250. mysql> desc tb_bookinfobak;
  251. -> //
  252. +----------+------------------+------+-----+---------+-------+
  253. | Field | Type | Null | Key | Default | Extra |
  254. +----------+------------------+------+-----+---------+-------+
  255. | barcode | varchar(30) | YES | | NULL | |
  256. | bookname | varchar(70) | YES | | NULL | |
  257. | typeid | int(10) unsigned | YES | | NULL | |
  258. | author | varchar(30) | YES | | NULL | |
  259. | ISBN | varchar(20) | YES | | NULL | |
  260. | price | float(8,2) | YES | | NULL | |
  261. | page | int(10) unsigned | YES | | NULL | |
  262. | bookcase | int(10) unsigned | YES | | NULL | |
  263. | inTime | date | YES | | NULL | |
  264. | del | tinyint(1) | YES | | 0 | |
  265. | id | int(11) | NO | | NULL | |
  266. +----------+------------------+------+-----+---------+-------+
  267. 11 rows in set (0.00 sec)
  268.  
  269. mysql> select * from tb_bookinfo;
  270. -> //
  271. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  272. | barcode | bookname | typeid | author | ISBN | price | page | bookcase | inTime | del | id |
  273. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  274. | 17120107 | Java King | 3 | LianJiang | 115 | 49.80 | 350 | 1 | 2018-04-17 | 0 | 1 |
  275. | 17120108 | Lian | 1 | QiaoJiang | 116 | 50.00 | 351 | 2 | 2018-04-18 | 0 | 2 |
  276. | 17120109 | Tian King | 2 | TianJiang | 117 | 51.10 | 352 | 3 | 2018-04-19 | 0 | 3 |
  277. | 17120110 | ShenOba | 4 | ShenJiang | 118 | 52.15 | 300 | 4 | 2018-04-20 | 0 | 4 |
  278. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  279. 4 rows in set (0.00 sec)
  280.  
  281. mysql> select * from tb_bookbak;
  282. -> //
  283. ERROR 1146 (42S02): Table 'db_library.tb_bookbak' doesn't exist
  284. mysql> select * from tb_bookinfobak;
  285. -> //
  286. Empty set (0.00 sec)
  287.  
  288. mysql> select * from tb_booklog;
  289. -> //
  290. +----+------------+---------------------+
  291. | id | event | logtime |
  292. +----+------------+---------------------+
  293. | 2 | look at me | 2018-04-18 19:40:02 |
  294. +----+------------+---------------------+
  295. 1 row in set (0.00 sec)
  296.  
  297. mysql> delete from tb_bookinfo where id=1;
  298. -> //
  299. Query OK, 1 row affected (0.01 sec)
  300.  
  301. mysql> select * from tb_bookinfobak;
  302. -> //
  303. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  304. | barcode | bookname | typeid | author | ISBN | price | page | bookcase | inTime | del | id |
  305. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  306. | 17120107 | Java King | 3 | LianJiang | 115 | 49.80 | 350 | 1 | 2018-04-17 | 0 | 1 |
  307. +----------+-----------+--------+-----------+------+-------+------+----------+------------+------+----+
  308. 1 row in set (0.00 sec)
  309.  
  310. mysql> select * from tb_booklog;
  311. -> //
  312. +----+------------+---------------------+
  313. | id | event | logtime |
  314. +----+------------+---------------------+
  315. | 2 | look at me | 2018-04-18 19:40:02 |
  316. | 8 | let me go | 2018-04-18 20:54:19 |
  317. +----+------------+---------------------+
  318. 2 rows in set (0.00 sec)

  二、查看触发器

  1.SHOW TRIGGER语句

  1. mysql> SHOW TRIGGERs\G
  2. *************************** 1. row ***************************
  3. Trigger: delete_book_info
  4. Event: DELETE
  5. Table: tb_bookinfo
  6. Statement: BEGIN
  7. INSERT INTO tb_booklog(event,logtime) values('let me go',now());
  8. INSERT INTO tb_bookinfobak SELECT * FROM tb_bookinfo where id=OLD.id;
  9. END
  10. Timing: BEFORE
  11. Created: 2018-04-18 20:35:07.19
  12. sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  13. Definer: root@localhost
  14. character_set_client: gbk
  15. collation_connection: gbk_chinese_ci
  16. Database Collation: utf8_general_ci
  17. 1 row in set (0.00 sec)

  2.查看triggers表中的触发信息

  (1)查看所有触发器的定义

  1. mysql> SELECT * FROM information_schema.triggers\G
  2. *************************** 1. row ***************************
  3. TRIGGER_CATALOG: def
  4. TRIGGER_SCHEMA: db_library
  5. TRIGGER_NAME: delete_book_info
  6. EVENT_MANIPULATION: DELETE
  7. EVENT_OBJECT_CATALOG: def
  8. EVENT_OBJECT_SCHEMA: db_library
  9. EVENT_OBJECT_TABLE: tb_bookinfo
  10. ACTION_ORDER: 1
  11. ACTION_CONDITION: NULL
  12. ACTION_STATEMENT: BEGIN
  13. INSERT INTO tb_booklog(event,logtime) values('let me go',now());
  14. INSERT INTO tb_bookinfobak SELECT * FROM tb_bookinfo where id=OLD.id;
  15. END
  16. ACTION_ORIENTATION: ROW
  17. ACTION_TIMING: BEFORE
  18. ACTION_REFERENCE_OLD_TABLE: NULL
  19. ACTION_REFERENCE_NEW_TABLE: NULL
  20. ACTION_REFERENCE_OLD_ROW: OLD
  21. ACTION_REFERENCE_NEW_ROW: NEW
  22. CREATED: 2018-04-18 20:35:07.19
  23. SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  24. DEFINER: root@localhost
  25. CHARACTER_SET_CLIENT: gbk
  26. COLLATION_CONNECTION: gbk_chinese_ci
  27. DATABASE_COLLATION: utf8_general_ci
  28. *************************** 2. row ***************************
  29. TRIGGER_CATALOG: def
  30. TRIGGER_SCHEMA: sys
  31. TRIGGER_NAME: sys_config_insert_set_user
  32. EVENT_MANIPULATION: INSERT
  33. EVENT_OBJECT_CATALOG: def
  34. EVENT_OBJECT_SCHEMA: sys
  35. EVENT_OBJECT_TABLE: sys_config
  36. ACTION_ORDER: 1
  37. ACTION_CONDITION: NULL
  38. ACTION_STATEMENT: BEGIN IF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THEN SET NEW.set_by = USER(); END IF; END
  39. ACTION_ORIENTATION: ROW
  40. ACTION_TIMING: BEFORE
  41. ACTION_REFERENCE_OLD_TABLE: NULL
  42. ACTION_REFERENCE_NEW_TABLE: NULL
  43. ACTION_REFERENCE_OLD_ROW: OLD
  44. ACTION_REFERENCE_NEW_ROW: NEW
  45. CREATED: 2018-01-08 16:14:42.70
  46. SQL_MODE:
  47. DEFINER: mysql.sys@localhost
  48. CHARACTER_SET_CLIENT: utf8
  49. COLLATION_CONNECTION: utf8_general_ci
  50. DATABASE_COLLATION: utf8_general_ci
  51. *************************** 3. row ***************************
  52. TRIGGER_CATALOG: def
  53. TRIGGER_SCHEMA: sys
  54. TRIGGER_NAME: sys_config_update_set_user
  55. EVENT_MANIPULATION: UPDATE
  56. EVENT_OBJECT_CATALOG: def
  57. EVENT_OBJECT_SCHEMA: sys
  58. EVENT_OBJECT_TABLE: sys_config
  59. ACTION_ORDER: 1
  60. ACTION_CONDITION: NULL
  61. ACTION_STATEMENT: BEGIN IF @sys.ignore_sys_config_triggers != true AND NEW.set_by IS NULL THEN SET NEW.set_by = USER(); END IF; END
  62. ACTION_ORIENTATION: ROW
  63. ACTION_TIMING: BEFORE
  64. ACTION_REFERENCE_OLD_TABLE: NULL
  65. ACTION_REFERENCE_NEW_TABLE: NULL
  66. ACTION_REFERENCE_OLD_ROW: OLD
  67. ACTION_REFERENCE_NEW_ROW: NEW
  68. CREATED: 2018-01-08 16:14:42.70
  69. SQL_MODE:
  70. DEFINER: mysql.sys@localhost
  71. CHARACTER_SET_CLIENT: utf8
  72. COLLATION_CONNECTION: utf8_general_ci
  73. DATABASE_COLLATION: utf8_general_ci
  74. 3 rows in set (0.03 sec)

  (2)查看指定触发器名称的触发器的定义(指定数据库时将NAME改成SCHEMA,等号后面改成数据库名)

  1. mysql> SELECT * FROM information_schema.triggers WHERE TRIGGER_NAME='delete_book_info'\G;
  2. *************************** 1. row ***************************
  3. TRIGGER_CATALOG: def
  4. TRIGGER_SCHEMA: db_library
  5. TRIGGER_NAME: delete_book_info
  6. EVENT_MANIPULATION: DELETE
  7. EVENT_OBJECT_CATALOG: def
  8. EVENT_OBJECT_SCHEMA: db_library
  9. EVENT_OBJECT_TABLE: tb_bookinfo
  10. ACTION_ORDER: 1
  11. ACTION_CONDITION: NULL
  12. ACTION_STATEMENT: BEGIN
  13. INSERT INTO tb_booklog(event,logtime) values('let me go',now());
  14. INSERT INTO tb_bookinfobak SELECT * FROM tb_bookinfo where id=OLD.id;
  15. END
  16. ACTION_ORIENTATION: ROW
  17. ACTION_TIMING: BEFORE
  18. ACTION_REFERENCE_OLD_TABLE: NULL
  19. ACTION_REFERENCE_NEW_TABLE: NULL
  20. ACTION_REFERENCE_OLD_ROW: OLD
  21. ACTION_REFERENCE_NEW_ROW: NEW
  22. CREATED: 2018-04-18 20:35:07.19
  23. SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  24. DEFINER: root@localhost
  25. CHARACTER_SET_CLIENT: gbk
  26. COLLATION_CONNECTION: gbk_chinese_ci
  27. DATABASE_COLLATION: utf8_general_ci
  28. 1 row in set (0.01 sec)

  三、使用触发器

  1.触发器的执行顺序

  1. mysql> create table if not exists tb_temp(
  2. -> id int(11) PRIMARY KEY auto_increment NOT NULL,
  3. -> event varchar(200) NOT NULL,
  4. -> time timestamp NOT NULL DEFAULT current_timestamp
  5. -> );
  6. Query OK, 0 rows affected (0.03 sec)
  1. mysql> create table tb_bookcase(
  2. -> id int(11) PRIMARY KEY auto_increment NOT NULL,
  3. -> name varchar(200)
  4. -> );
  5. Query OK, 0 rows affected (0.02 sec)
  6.  
  7. mysql> create trigger before_in BEFORE INSERT ON
  8. -> tb_bookcase FOR EACH ROW
  9. -> INSERT INTO tb_temp(event) values('BEFORE INSERT');
  10. Query OK, 0 rows affected (0.01 sec)
  11.  
  12. mysql> create trigger after_in AFTER INSERT ON
  13. -> tb_bookcase FOR EACH ROW
  14. -> INSERT INTO tb_temp(event) values('AFTER INSERT');
  15. Query OK, 0 rows affected (0.01 sec)
  16.  
  17. mysql> select * from tb_bookcase;
  18. Empty set (0.00 sec)
  19.  
  20. mysql> select * from tb_temp;
  21. Empty set (0.00 sec)
  22.  
  23. mysql> INSERT INTO tb_bookcase(name) VALUES('左边第二个');
  24. Query OK, 1 row affected (0.01 sec)
  25.  
  26. mysql> select * from tb_bookcase;
  27. +----+-----------------+
  28. | id | name |
  29. +----+-----------------+
  30. | 1 | 左边第二个 |
  31. +----+-----------------+
  32. 1 row in set (0.00 sec)
  33.  
  34. mysql> select * from tb_temp;
  35. +----+---------------+---------------------+
  36. | id | event | time |
  37. +----+---------------+---------------------+
  38. | 1 | BEFORE INSERT | 2018-04-19 08:17:28 |
  39. | 2 | AFTER INSERT | 2018-04-19 08:17:28 |
  40. +----+---------------+---------------------+
  41. 2 rows in set (0.00 sec)

  2.使用触发器维护冗余数据(为了避免数据不一致问题的发生,尽量不要人工维护数据,建议通过编程自动维护)

  1. mysql> create table tb_stock(
  2. -> id int(11) PRIMARY KEY auto_increment NOT NULL.
  3. -> id int(11) PRIMARY KEY auto_increment NOT NULL.^C
  4. mysql> create table tb_stock(
  5. -> id int(11) PRIMARY KEY auto_increment NOT NULL,
  6. -> goodsname varchar(200) NOT NULL,
  7. -> number int(11)
  8. -> );
  9. Query OK, 0 rows affected (0.02 sec)
  1. mysql> select * from tb_stock;
  2. +----+-------------+--------+
  3. | id | goodsname | number |
  4. +----+-------------+--------+
  5. | 1 | 小猪佩qi | 100 |
  6. +----+-------------+--------+
  7. 1 row in set (0.00 sec)
  1. mysql> create table tb_sell(
  2. -> id int(11) PRIMARY KEY auto_increment NOT NULL,
  3. -> goodsname varchar(200),
  4. -> number int(11)
  5. -> );
  6. -> //
  7. Query OK, 0 rows affected (0.02 sec)
  8.  
  9. mysql> select * from tb_sell;
  10. -> //
  11. Empty set (0.00 sec)
  1. mysql> CREATE TRIGGER auto_number AFTER INSERT
  2. -> ON tb_sell FOR EACH ROW
  3. -> BEGIN
  4. -> DECLARE sellnum int(10);
  5. -> SELECT number FROM tb_sell where id=NEW.id INTO @sellnum;
  6. -> UPDATE tb_stock SET number=number-@sellnum WHERE goodsname='小猪佩qi';
  7. -> END
  8. -> //
  9. Query OK, 0 rows affected (0.01 sec)
  1. mysql> INSERT INTO tb_sell(goodsname,number) VALUES
  2. -> ('小猪佩qi',2);
  3. -> //
  4. Query OK, 1 row affected (0.01 sec)
  5.  
  6. mysql> select * from tb_sell;
  7. -> //
  8. +----+-------------+--------+
  9. | id | goodsname | number |
  10. +----+-------------+--------+
  11. | 1 | 小猪佩qi | 2 |
  12. +----+-------------+--------+
  13. 1 row in set (0.00 sec)
  14.  
  15. mysql> select * from tb_stock;
  16. -> //
  17. +----+-------------+--------+
  18. | id | goodsname | number |
  19. +----+-------------+--------+
  20. | 1 | 小猪佩qi | 98 |
  21. +----+-------------+--------+
  22. 1 row in set (0.00 sec)

  四、删除触发器

Mysql数据库(七)触发器的更多相关文章

  1. MySQL数据库之触发器

    1 引言 本文是对MySQL中触发器的总结,从触发器概念出发,结合实例对创建触发器.使用触发器.删除触发器进行介绍. 2 触发器简介 MySQL触发器和存储过程一样,都是嵌入到MySQL的一段程序.触 ...

  2. Mysql数据库的触发器、存储引擎和存储过程

    数据库的触发器 1.触发器 触发器是MySQL响应以下任意语句而自动执行的一条MySQL语句(或位于BEGIN和END语句之间的一组语句): DELETE,INSERT,UPDATE 我们可以监视某表 ...

  3. 40、mysql数据库(触发器)

    1.触发器说明: 使用触发器可以定制用户对表进行[增.删.改]操作时前后的行为,注意:没有查询. 2.创建触发器语法: (1)插入前: CREATE TRIGGER tri_before_insert ...

  4. mysql数据库之 存储引擎、事务、视图、触发器、存储过程、函数、流程控制、数据库备份

    目录 一.存储引擎 1.什么是存储引擎? 2.mysql支持的存储引擎 3. 使用存储引擎 二.事务 三.视图 1.什么是视图 2.为什么要用视图 3.如何用视图 四.触发器 为何要用触发器 创建触发 ...

  5. python面试题七: mysql数据库

    ---------------------------------------------------------------------------------------------------- ...

  6. PHP操作MySQL数据库之天龙八部 -- 七贱下天山 -- 六脉神剑

    天龙八部            八步操作数据库 七贱下天山        七步操作数据库  (将判断错误省略) 六脉神剑            六步操作数据库(将判断错误省略,将选择数据库添加到第一步 ...

  7. 第二百七十六节,MySQL数据库,【显示、创建、选定、删除数据库】,【用户管理、对用户增删改查以及授权】

    MySQL数据库,[显示.创建.选定.删除数据库],[用户管理.对用户增删改查以及授权] 1.显示数据库 SHOW DATABASES;显示数据库 SHOW DATABASES; mysql - 用户 ...

  8. 第二百八十四节,MySQL数据库-MySQL触发器

    MySQL数据库-MySQL触发器 对某个表进行[增/删/改]操作的前后如果希望触发某个特定的行为时,可以使用触发器,触发器用于定制用户对表的行进行[增/删/改]前后的行为. 1.创建触发器基本语法 ...

  9. mysql数据库从删库到跑路之mysql:视图、触发器、事务、存储过程、函数

    mysql:视图.触发器.事务.存储过程.函数 一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果 ...

  10. MySQL数据库(6)_用户操作与权限管理、视图、存储过程、触发器、基本函数

    用户操作与权限管理 MySQL用户操作 创建用户 方法一: CREATE USER语句创建 CREATE USER "用户名"@"IP地址" IDENTIFIE ...

随机推荐

  1. event.stopPropagation()、event.preventDefault()与return false的区别

    做小demo时经常用到return false来取消默认事件,但一直不是很懂它和preventDefault()等的区别,今天查了查文档和大神们的博客,在这里对相关知识点做一个总结 首先开门见山,总结 ...

  2. 【django】分页

    分页 1.简单分页 from django.conf.urls import url from django.contrib import admin from app01 import views ...

  3. Java 基础篇之异常

    异常 异常层次 Error:Java 运行时系统的内部错误和资源耗尽错误.应用程序不应该抛出这种类型的对象.如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了. Ex ...

  4. Java 基础篇之集合

    List 集合 List 集合中元素有序.可重复,集合中每个元素都有其对应的索引顺序. List 判断两个对象相等,只要通过 equals 方法比较返回 true 即可. 看个例子: public c ...

  5. Angular ngx-echarts图表

    1. 安装echarts包.ngx-echarts包 npm install echarts --save npm install ngx-echarts --save 2. angular.json ...

  6. logrotate 不生效

    登录服务器查看,发现日志没有自动切割.去查看micros配置文件: [root@ecs-11-151 ~]# cat /etc/logrotate.d/micros /data/logs/*/*.lo ...

  7. git 查看日志记录

    1.git log 如果日志特别多的话,在git bash中,按向下键来查看更多,按q键退出查看日志. 2.git show 查看最近一次commit内容,也可以后面加commit号,单独查看此次版本 ...

  8. (八十二)c#Winform自定义控件-穿梭框

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  9. Java 学习笔记之 线程Priority

    线程Priority: 线程可以划分优先级,优先级较高的线程得到的CPU资源较多,也就是CPU优先执行优先级较高的线程对象中的任务. 设置线程优先级有助于帮助“线程规划器”确定在下一次选择哪个线程来优 ...

  10. iOS渠道分包2种模式之包内注入文件分包

    解决问题:商业模式中会存在这样的形式1款app需要不同的运用团队(工会)去分包推广,谁推广的包下载的人数都会在服务器记录,不同渠道的标示唯一来区分. iOS渠道分包模式有两种 一.IDFA模式 IDF ...