MySQL触发器运用于迁移和同步数据的实例教程_Mysql

1.迁移数据
进行数据库移植,SQL Server=>MySQL。SQL Server上有如下的Trigger

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
ALTER TRIGGER [trg_risks] ON dbo.projectrisk
FOR INSERT, UPDATE
AS
BEGIN
UPDATE projectrisk
  SET classification =
  case
  when calc>= 9 then 3
  when calc <9 and calc>=4 then 2
  when calc <4 then 1
  end
  from (select inserted.id, inserted.possibility*inserted.severity as calc from inserted) as T1
  where projectrisk.id = T1.id
END
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

简单了解了下MySQL中,Trigger的语法。

# 创建
CREATE TRIGGER <触发器名称>
{ BEFORE | AFTER }
{ INSERT | UPDATE | DELETE }
ON <表名称>
FOR EACH ROW
<触发器SQL语句> 

# 删除
DROP TRIGGER <触发器名称> 

注:创建触发器需要CREATE TRIGGER权限。(HeidiSQL中执行Trigger语句会有bug)

由于MySQL中的每个触发器只能针对一个动作,所以本次移植就需要创建两个触发器。对于发生变更的行,在触发器中可以用 NEW 来代替。
下边的触发器有什么问题吗?

delimiter &&
CREATE TRIGGER trg_risks_insert
AFTER INSERT ON `projectrisk`
FOR EACH ROW
UPDATE projectrisk SET classification = CASE
WHEN possibility*severity>=9 THEN 3
WHEN possibility*severity <9 AND possibility*severity>=4 THEN 2
WHEN possibility*severity <4 THEN 1
END
WHERE id = new.id;
&&
CREATE TRIGGER trg_risks_update
AFTER UPDATE ON `projectrisk`
FOR EACH ROW
UPDATE projectrisk SET classification = CASE
WHEN possibility*severity>=9 THEN 3
WHEN possibility*severity <9 AND possibility*severity>=4 THEN 2
WHEN possibility*severity <4 THEN 1
END
WHERE id = new.id;
&&
delimiter ; 

问题就是,没有考虑到触发器中的修改也会触发触发器,进入了死循环。做了如下修改后,终于OK了。

delimiter &&
CREATE TRIGGER trg_risks_insert
BEFORE INSERT ON `projectrisk`
FOR EACH ROW
BEGIN
 SET new.classification = CASE
 WHEN new.possibility*new.severity>=9 THEN 3
 WHEN new.possibility*new.severity <9 AND new.possibility*new.severity>=4 THEN 2
 WHEN new.possibility*new.severity <4 THEN 1
 END;
END
&&
CREATE TRIGGER trg_risks_update
BEFORE UPDATE ON `projectrisk`
FOR EACH ROW
BEGIN
 SET new.classification = CASE
 WHEN new.possibility*new.severity>=9 THEN 3
 WHEN new.possibility*new.severity <9 AND new.possibility*new.severity>=4 THEN 2
 WHEN new.possibility*new.severity <4 THEN 1
 END;
END
&&
delimiter ; 

2.同步备份数据记录表
添加记录到新记录表

DELIMITER $$
USE `DB_Test`$$
CREATE
  /*!50017 DEFINER = 'root'@'%' */
  TRIGGER `InsertOPM_Alarm_trigger` BEFORE INSERT ON `OPM_Alarm`
  FOR EACH ROW BEGIN
INSERT INTO OPM_Alarm_copy (AlarmId,AlarmCode,AlarmTypeId,AlarmLevelId,AlarmObjectCode,AlarmStatus,AlarmHandleUser,
AlarmHandleTime,ADDTIME,ParkUserId,BerthCode,BargainOrderCode,BerthStartTime)
VALUES(new.AlarmId,new.AlarmCode,new.AlarmTypeId,new.AlarmLevelId,new.AlarmObjectCode,new.AlarmStatus,new.AlarmHandleUser,
new.AlarmHandleTime,new.ADDTIME,new.ParkUserId,new.BerthCode,new.BargainOrderCode,new.BerthStartTime);
  END;
$$
DELIMITER ;

CREATE TRIGGER InsertOPM_Alarm_trigger
 BEFORE INSERT ON OPM_Alarm
 FOR EACH ROW
BEGIN
INSERT INTO OPM_Alarm_copy (AlarmId,AlarmCode,AlarmTypeId,AlarmLevelId,AlarmObjectCode,AlarmStatus,AlarmHandleUser,
AlarmHandleTime,ADDTIME,ParkUserId,BerthCode,BargainOrderCode,BerthStartTime)
VALUES(new.AlarmId,new.AlarmCode,new.AlarmTypeId,new.AlarmLevelId,new.AlarmObjectCode,new.AlarmStatus,new.AlarmHandleUser,
new.AlarmHandleTime,new.ADDTIME,new.ParkUserId,new.BerthCode,new.BargainOrderCode,new.BerthStartTime);
END ;

 mysql触发器监控mysql数据表记录删除操作 DELIMITER $$

USE `DB_Test`$$

DROP TRIGGER /*!50032 IF EXISTS */ `SYS_OPM_trigger`$$

CREATE
  /*!50017 DEFINER = 'root'@'%' */
  TRIGGER `SYS_OPM_trigger` AFTER DELETE ON `OPM_Alarm`
  FOR EACH ROW BEGIN
  DECLARE str VARCHAR(40000);
   SET str=CONCAT(old.AlarmId,'@',old.AlarmCode,'@',old.AlarmTypeId,'@',old.AlarmLevelId,'@',
   old.AlarmObjectCode,'@',old.AlarmStatus,'@',old.AlarmHandleUser,'@',old.AlarmHandleTime,'@',
   old.AddTime,'@',old.ParkUserId,'@',old.BerthCode,'@',old.BargainOrderCode,'@',old.BerthStartTime);
   INSERT INTO OPM_AlarmAction_log(UserName,Client_IP,Delete_before_key,Delete_Date)
  VALUES(SUBSTRING_INDEX(USER(),'@',1),SUBSTRING_INDEX(USER(),'@',-1), str, NOW());
  END;
$$

DELIMITER ;

删除前 添加原记录备份到另一记录表

DELIMITER $$

USE `DB_Test`$$

DROP TRIGGER /*!50032 IF EXISTS */ `InsertOPM_Alarm_trigger`$$

CREATE
  /*!50017 DEFINER = 'root'@'%' */
  TRIGGER `InsertOPM_Alarm_trigger` BEFORE 

DELETE ON `OPM_Alarm`
  FOR EACH ROW BEGIN
   INSERT INTO OPM_Alarm_copy 

(AlarmId,AlarmCode,AlarmTypeId,AlarmLevelId,AlarmObjectCode,AlarmStatus,AlarmHandleUser,
    AlarmHandleTime,ADDTIME,ParkUserId,BerthCode,BargainOrderCode,BerthStartTime)
     VALUES

(old.AlarmId,old.AlarmCode,old.AlarmTypeId,old.AlarmLevelId,old.AlarmObjectCode,old.AlarmS

tatus,old.AlarmHandleUser,

old.AlarmHandleTime,old.ADDTIME,old.ParkUserId,old.BerthCode,old.BargainOrderCode,old.Bert

hStartTime);

  END;
$$

DELIMITER ;

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mysql
, 触发器
, 教程
MySQL教程
mysql触发器实例、php mysql触发器实例、mysql触发器事务实例、mysql触发器实例 new、mysql删除触发器 实例,以便于您获取更多的相关知识。

时间: 2024-09-16 01:44:00

MySQL触发器运用于迁移和同步数据的实例教程_Mysql的相关文章

MySQL慢查询优化之慢查询日志分析的实例教程_Mysql

数据库响应慢问题最多的就是查询了.现在大部分数据库都提供了性能分析的帮助手段.例如Oracle中会帮你直接找出慢的语句,并且提供优化方案.在MySQL中就要自己开启慢日志记录加以分析(记录可以保存在表或者文件中,默认是保存在文件中,我们系统使用的就是默认方式). 先看看MySQL慢查询日志里面的记录长什么样的: Time Id Command Argument # Time: 141010 9:33:57 # User@Host: root[root] @ localhost [] Id: 1

FLASH调用XML数据代码实例教程

FLASH调用XML数据代码实例教程 FLASH如何调用XML数据:建立XML对象: var myXML = new XML(); 引用XML文件: myXML.load("data.xml"); 忽略空格: myXML.ignoreWhite = true;//默认的为false 处理XML对象的函数: myXML.onLoad = function(success){ statements;} data.XML文件的内容: xiaoshandong xiaoshandong3 my

mysql drop database删除数据库命令实例讲解_Mysql

mysql drop database命令用于删除一个数据库,如果试图使用drop database命令删除一个不存在的数据库,那么那么你会收到此错误:ERROR 1008 (HY000): Can't drop database 'tutorial_database'; database doesn't exist,本文章向大家介绍mysql drop database使用实例. 首先在使用drop database删除数据库之前,我们需要连接到数据库服务器. 我们可以使用以下命令登录到mys

Mysql的列修改成行并显示数据的简单实现_Mysql

创建测试表: DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `year` int(11) DEFAULT NULL, `month` int(11) DEFAULT NULL, `amount` double DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 插入数据: INSERT INTO `test` VALUES ('1991', '1', '1.1'); INSERT INTO

在MySQL中使用JOIN语句进行连接操作的详细教程_Mysql

到目前,我们已经学习了从一个表中获取数据.这是简单的需要,但在大多数现实MySQL的使用,经常需要将数据从多个表中的一个单一的查询. 可以使用多个表中的单一SQL查询.在MySQL中联接(join)行为是指两个或多个表到一个表中可以使用连接在SELECT,UPDATE和DELETE语句中加入MySQL表.我们将看到一个例子LEFT JOIN简单的MySQL连接.在命令提示符使用联接: 假设我们两个表的教程tcount_tbl和tutorials_tbl的完整列表如下: 例子: 试试下面的例子:

Mysql 5.6.24安装实例教程_Mysql

安装前准备工作: 1)编辑PATH路径 vim /etc/profile PATH=/home/mysql/bin:/home/mysql/lib:$PATH export PATH 2)生效PATH source /etc/profile 3)编辑hosts vim /etc/hosts 192.168.117.130 cc-test 安装 1.环境配置 yum install - y gcc gcc-c++ make cmake 2.准备好安装包mysql-5.6.24.tar.gz,并将它

mysql 触发器实现两个表的数据同步_Mysql

mysql通过触发器实现两个表的同步 目前,在本地测试成功. 假设本地的两个数据库a和b,a下有表table1(id, val) b下有表table2(id, val) 假设希望当table1中数据更新,table2中数据同步更新. 代码: DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ TRIGGER `a`.`触发器名` BEFORE UPDATE ON `a`.`table1` FOR EACH ROW BEGIN I

Linux下将数据库从MySQL迁移到MariaDB的基础操作教程_Mysql

自从2012年来,维基百科已经开始从MySQL迁移到MariaDB的过程,是维基媒体数据库架构变革的一个重大里程碑,将英文和德文版的维基百科数据库Wikidata移植到了MariaDB 5.5版本上. 在过去几年中,维基百科一直使用 Facebook 的 MySQL 5.1 衍生版本 作为我们的产品数据库,构建版本号是r3753.我们很高兴该产品的性能表现,Facebook 有着全世界最棒的数据库工程师,他们为 MySQL 生态系统带去了很多改进. 现在 MariaDB 的优化器的增强.Perc

mysql 开发技巧之JOIN 更新和数据查重/去重_Mysql

主要涉及:JOIN .JOIN 更新.GROUP BY HAVING 数据查重/去重 1 INNER JOIN.LEFT JOIN.RIGHT JOIN.FULL JOIN(MySQL 不支持).CROSS JOIN 这是在网上找到的非常好的一篇博文,图解 join 语句: CODING HORROR-A Visual Explanation of SQL Joins 下图可以很清楚的明白,join 的数据选取范围 [][1] [1]: yun_qi_img/160725-imooc-mysql