【mysql】mysql触发器使用示例
mysql触发器
- 时间点:before/after
 - 触发事件: update/delete/insert
 - 时间点+触发事件:构成一个完整的触发器的触发时机;
 - 一个触发时机最多只能由1个Trigger:如 before-insert最多只能有1个触发器,如果需要多个,需要在1个Trigger内些sql Statement;
 
old和new
- insert:只有new关键字可以使用;
 - update: new和old关键字都可以使用;
 - delete: 只有old关键字可以使用;
 
建表语句 + 触发器 (capacity_pm)
CREATE TABLE `capacity_pm` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `pool_id` char(36) CHARACTER SET utf8 DEFAULT NULL COMMENT '资源池ID',
  `cluster_lv1` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '集群分类',
  `cluster_lv2` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '集群2级分类',
  `update_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新或创建时间',
  `templete_id` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '模板ID',
  `templete_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '模板名称',
  `templete_cpu_core` int(10) unsigned zerofill NOT NULL COMMENT '模板CPU核数',
  `templete_mem_size` double NOT NULL COMMENT '模板内存大小',
  `templete_disk_size` double NOT NULL COMMENT '模板磁盘大小',
  `host_total` int(11) unsigned zerofill DEFAULT NULL COMMENT '主机总数',
  `host_used` int(11) unsigned zerofill DEFAULT NULL COMMENT '主机已分配数量',
  `cpu_core_total` int(11) unsigned zerofill DEFAULT NULL COMMENT 'cpu总核数',
  `cpu_core_free` int(11) DEFAULT NULL,
  `cpu_core_used` int(11) DEFAULT NULL COMMENT 'cpu已分配数量',
  `cpu_core_util` double(10,3) DEFAULT NULL COMMENT 'cpu核数使用占比',
  `mem_total` double DEFAULT NULL COMMENT '内存总空间',
  `mem_free` double DEFAULT NULL,
  `mem_used` double DEFAULT NULL,
  `mem_util` double DEFAULT NULL COMMENT '内存使用占比',
  `disk_total` double DEFAULT NULL,
  `disk_free` double DEFAULT NULL,
  `disk_used` double DEFAULT NULL,
  `disk_util` double DEFAULT NULL COMMENT '磁盘使用占比',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_templete_all` (`pool_id`,`templete_id`) USING BTREE COMMENT '模块ID做完整索引'
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
CREATE TRIGGER `pm_before_insert_trigger` BEFORE INSERT ON `capacity_pm` FOR EACH ROW begin
set new.cpu_core_total=new.host_total * new.templete_cpu_core;
set new.cpu_core_used=new.host_used * new.templete_cpu_core;
set new.cpu_core_free=new.cpu_core_total - new.cpu_core_used;
set new.cpu_core_util=new.cpu_core_used / new.cpu_core_total;
end;
CREATE TRIGGER `pm_before_update_trigger` BEFORE UPDATE ON `capacity_pm` FOR EACH ROW begin
set new.cpu_core_total=new.host_total * old.templete_cpu_core;
set new.cpu_core_used=new.host_used * old.templete_cpu_core;
set new.cpu_core_free=new.cpu_core_total - new.cpu_core_used;
set new.cpu_core_util=new.cpu_core_used / new.cpu_core_total;
end;
使用navicat工具示例

测试1:直接插入数据
INSERT INTO `capacity_pm` (
	pool_id,
	cluster_lv1,
	cluster_lv2,
	update_at,
	templete_id,
	templete_name,
	templete_cpu_core,
	templete_mem_size,
	templete_disk_size,
	host_total,
	host_used
)
VALUES
	(
		'7b8f0f5e2fbb4d9aa2d5fd55466d638h',null,null,now(),
		't003',
		'null',
		'8',
		'100',
		'200',
		'100',
		'20'
	),
	(
		'7b8f0f5e2fbb4d9aa2d5fd55466d638h',null,null,now(),
		't002',
		'null',
		'16',
		'100',
		'200',
		'40',
		'30'
	) ON DUPLICATE KEY UPDATE host_total =VALUES(host_total),	host_used =VALUES(host_used);
测试2:insert into table...select from other table;
- 待插入的数据:来自于其他表的查询;
 - 使用 
ON DUPLICATE KEY UPDATE批量更新; 
创建另一个表,模拟数据来源
CREATE TABLE `capacity_pm_tmp` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  `pool_id` char(36) CHARACTER SET utf8 DEFAULT NULL COMMENT '资源池ID',
  `cluster_lv1` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '集群分类',
  `cluster_lv2` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '集群2级分类',
  `update_at` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '更新或创建时间',
  `templete_id` varchar(255) CHARACTER SET utf8 NOT NULL COMMENT '模板ID',
  `templete_name` varchar(255) CHARACTER SET utf8 DEFAULT NULL COMMENT '模板名称',
  `templete_cpu_core` int(10) unsigned zerofill NOT NULL COMMENT '模板CPU核数',
  `templete_mem_size` double NOT NULL COMMENT '模板内存大小',
  `templete_disk_size` double NOT NULL COMMENT '模板磁盘大小',
  `host_total` int(11) unsigned zerofill DEFAULT NULL COMMENT '主机总数',
  `host_used` int(11) unsigned zerofill DEFAULT NULL COMMENT '主机已分配数量',
  PRIMARY KEY (`id`),
  UNIQUE KEY `idx_templete_all` (`pool_id`,`templete_id`) USING BTREE COMMENT '模块ID做完整索引'
) ENGINE=InnoDB AUTO_INCREMENT=135 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
INSERT INTO `capacity_pm_tmp` VALUES ('1', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, null, 't001', null, '0000000008', '2000', '1000', '00000000100', '00000000030');
INSERT INTO `capacity_pm_tmp` VALUES ('2', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, null, 't002', null, '0000000008', '1000', '1000', '00000000100', '00000000030');
INSERT INTO `capacity_pm_tmp` VALUES ('3', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, null, 't003', null, '0000000008', '1000', '1000', '00000000100', '00000000030');
INSERT INTO `capacity_pm_tmp` VALUES ('4', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, null, 't004', null, '0000000008', '1000', '2000', '00000000100', '00000000030');
INSERT INTO `capacity_pm_tmp` VALUES ('5', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, null, 't005', null, '0000000008', '1000', '2000', '00000000100', '00000000030');
INSERT INTO `capacity_pm_tmp` VALUES ('6', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, null, 't001', null, '0000000008', '1000', '2000', '00000000100', '00000000030');
INSERT INTO `capacity_pm_tmp` VALUES ('7', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, null, 't002', null, '0000000008', '1000', '2000', '00000000100', '00000000030');
INSERT INTO `capacity_pm_tmp` VALUES ('8', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, null, 't003', null, '0000000008', '1000', '2000', '00000000100', '00000000030');
INSERT INTO `capacity_pm_tmp` VALUES ('9', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, null, 't004', null, '0000000008', '1000', '2000', '00000000100', '00000000030');
INSERT INTO `capacity_pm_tmp` VALUES ('10', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, null, 't005', null, '0000000008', '1000', '2000', '00000000100', '00000000020');
INSERT INTO `capacity_pm_tmp` VALUES ('11', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, null, 't006', null, '0000000008', '1000', '2000', '00000000100', '00000000020');
INSERT INTO `capacity_pm_tmp` VALUES ('12', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, null, 't007', null, '0000000008', '1000', '2000', '00000000100', '00000000020');
INSERT INTO `capacity_pm_tmp` VALUES ('13', '7b8f0f5e2fbb4d9aa2d5fd55466d638e', null, null, null, 't00x', null, '0000000008', '1000', '2000', '00000000100', '00000000020');
INSERT INTO `capacity_pm_tmp` VALUES ('14', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, null, 't008', null, '0000000008', '1000', '2000', '00000000100', '00000000010');
INSERT INTO `capacity_pm_tmp` VALUES ('15', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, null, 't009', null, '0000000008', '1000', '2000', '00000000100', '00000000010');
INSERT INTO `capacity_pm_tmp` VALUES ('16', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, null, 't018', null, '0000000008', '1000', '2000', '00000000100', '00000000010');
INSERT INTO `capacity_pm_tmp` VALUES ('17', '7b8f0f5e2fbb4d9aa2d5fd55466d638f', null, null, null, 't019', null, '0000000008', '1000', '2000', '00000000100', '00000000010');
INSERT INTO `capacity_pm_tmp` VALUES ('18', '7b8f0f5e2fbb4d9aa2d5fd55466d638h', null, null, null, 't001', null, '0000000008', '1000', '2000', '00000000100', '00000000010');
INSERT INTO `capacity_pm_tmp` VALUES ('19', '7b8f0f5e2fbb4d9aa2d5fd55466d638h', null, null, null, 't002', null, '0000000008', '1000', '2000', '00000000100', '00000000010');
INSERT INTO `capacity_pm_tmp` VALUES ('20', '7b8f0f5e2fbb4d9aa2d5fd55466d638h', null, null, null, 't003', null, '0000000008', '3000', '2000', '00000000100', '00000000020');
测试插入数据
INSERT INTO `capacity_pm` (
	pool_id,
	cluster_lv1,
	cluster_lv2,
	update_at,
	templete_id,
	templete_name,
	templete_cpu_core,
	templete_mem_size,
	templete_disk_size,
	host_total,
	host_used
)
SELECT
	pool_id,
	cluster_lv1,
	cluster_lv2,
	update_at,
	templete_id,
	templete_name,
	templete_cpu_core,
	templete_mem_size,
	templete_disk_size,
	host_total,
	host_used
FROM
	capacity_pm_tmp
ON DUPLICATE KEY UPDATE host_total = VALUES(host_total), host_used=VALUES(host_used);
参考
【mysql】mysql触发器使用示例的更多相关文章
- (转)MySQL触发器trigger示例详解
		
一.什么是触发器 触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合.触发器的这种特性可以协助应用在数据库端确保数据的完整性. 举个例子,比如你现在有两个表[用户表]和[ ...
 - mysql trigger 触发器
		
创建触发器: CREATE [DEFINER = {user|CURRENT_USER}] TRIGGER trigger_name trigger_time trigger_event ON tbl ...
 - mysql之触发器trigger 详解
		
为了梦想,努力奋斗! 追求卓越,成功就会在不经意间追上你 mysql之触发器trigger 触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) ...
 - 初试mysql存储过程&触发器
		
玩mysql以来,一直没有试过实现存储过程,因为存储过程的语法看起来有些笨重.所以一直采用手动批量运行查询,而且要手动改日期之类的参数. 今天尝试着学了一会,发现其实是很简单的.语法上确实格式复杂些, ...
 - MySql之触发器的使用
		
一:触发器的使用场景 当数据库的记录发生变化时,自动触发某些操作. MySQL的触发器响应三种操作,六种场合: 三种操作:DELETE.INSERT.UPDATE. 六种场合:三种操作的BEFORE. ...
 - mysql权限管理命令示例
		
mysql权限管理命令示例 grant all privileges on *.* to *.* identified by 'hwalk1'; flush privileges; insert in ...
 - MYSQL:基础——触发器
		
MYSQL基础——触发器 引入触发器 什么是触发器 如果你想要某条语句(或某些语句)在事件发生时自动执行.比如: 每当订购一个产品时,都从库存数量中减去订购的数量:无论何时删除一行,都在某个存档表中保 ...
 - MySQL创建触发器的时候报1419错误( 1419 - You do not have the SUPER privilege and binary logging is enabled )
		
mysql创建触发器的时候报错: 解决方法:第一步,用root用户登录:mysql -u root -p第二步,设置参数log_bin_trust_function_creators为1:set gl ...
 - mysql  视图 触发器 存储过程 函数事务 索引
		
mysql 视图 触发器 存储过程 函数事务 索引 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当 ...
 - 初用MySQL  Mysql示例库  Navicat15
		
初用MySQL Mysql示例库 Navicat15 查询MySQl版本 Mysql shell > select version(); 右括号,not version 查看初始密码 M ...
 
随机推荐
- django之admin管理工具
			
admin组件 admin是django提供的基于web的管理工具 >如何使用: 1.激活管理工具 通常会在生成项目时在urls.py中自动设置好 from django.urls import ...
 - MapReduce(五)
			
MapReduce的(五) 1.MapReduce的多表关联查询. 根据文本数据格式.查询多个文本中的内容关联.查询. 2.MapReduce的多任务窜执行的使用 多任务的串联执行问题,主要是要建立c ...
 - (02) 第一个springboot程序
			
1. 创建一个springboot程序 1. idea 自带的springboot插件 2. 直接从https://start.spring.io 创建好程序下载下来, 之后覆盖你的创建的项目 2. ...
 - Linux c 从文件当中读取任意一行的数据
			
代码如下 #include <stdio.h>#include <stdlib.h>#include <sys/stat.h>#include <sys/ty ...
 - 告诉你们!我是怎么与Linux系统接触的!
			
最开始接触Linux是在15年来北京后,刚来北京机缘巧合,从事了实施工程师的工作.实施工作是一个面很广的工作.业务.技术.沟通等等方方面面的.技术一直是我是的短板.刚开始,公司在要在阿里云上部署APP ...
 - css样式 + 特殊符号
			
color控制字体颜色 十六进制值 #cc0066: font-size控制字体大小 单位 px / % / em / rem:像素 / 相对于父级元素 / 取决自己使用字体大小 / 取决于根元素ht ...
 - Xshell简单介绍
			
Xshell介绍 Xshell 是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议.Xshell 通过互联网到远程主机的安全 ...
 - sql 中取整,四舍五入取整,向下取整,向上取整。
			
SELECT round(52.45, 0) AS round4, round(52.54, 0) AS round5, round(52.45, 1) AS round41, round(52.54 ...
 - .net core IIS/Kestrel上传大文件的解决方法
			
大文件,就是内容的大小超过了一定数量的文件,比如1个GB的文件. 站点一般会限制上传文件的大小,如果超过了一定限制,则会报错误. 在处理大文件上传的方式上,IIS代理和Kestrel宿主服务器的处理方 ...
 - Code::Blocks环境下导入WS2_32.lib文件
			
打开菜单选项中 Settings -> Compiler 点击Add 找到lib文件的路径,导入 点击OK--OK,完成!