`
Donald_Draper
  • 浏览: 952235 次
社区版块
存档分类
最新评论

MySQL触发器

阅读更多
CHANGE MASTER:http://dev.mysql.com/doc/refman/5.5/en/change-master-to.html
Trigger Syntax and Examples:http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html
NDB Cluster Replication: Multi-Master and Circular Replication:
http://dev.mysql.com/doc/refman/5.6/en/mysql-cluster-replication-multi-master.html
MySQL触发器Trigger实例篇:http://blog.csdn.net/hireboy/article/details/18079183
--log-slave-updates:http://dev.mysql.com/doc/refman/5.6/en/replication-options-slave.html#option_mysqld_log-slave-updates
Mysql主从配置:http://donald-draper.iteye.com/admin/blogs/2337407
LOCK TABLES and UNLOCK TABLES:https://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
前面我们讲过mysql主从同步及串行同步,其实mysql还有一种变通的复制策略,利用触发器,
在一个表增加,更新,删除DML后,对另一个表或另一个库中的表进行相同的工作,今天我们就来测试一下触发器。
在测试之前,要新建两个数据库,一个为test,一个为log,
分别在test和log创建测试表结构test:
/*
Navicat MySQL Data Transfer

Source Server         : localhost
Source Server Version : 50041
Source Host           : localhost:3306
Source Database       : test

Target Server Type    : MYSQL
Target Server Version : 50041
File Encoding         : 65001

Date: 2016-11-24 18:16:59
*/

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for test
-- ----------------------------
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

新建插入触发器:
DELIMITER  $$
    USE `test` $$
    DROP TRIGGER  IF EXISTS  `test_insert` $$
    CREATE
        TRIGGER `test_insert` AFTER INSERT ON `test` 
        FOR EACH ROW 
	      BEGIN
               INSERT INTO `log`.`test` SET id = NEW.id, name=NEW.name;
        END;$$
DELIMITER;

插入数据:
INSERT INTO test VALUES (1,'donald');
INSERT INTO test VALUES (2,'jamel');

在log数据库中查看对应的test表:
mysql> use log;
Database changed
mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | donald |
|  2 | jamel  |
+----+--------+
创建更新触发器:
DELIMITER $$
    USE `test`$$
    DROP TRIGGER  IF EXISTS  `test_update` $$
    CREATE
        TRIGGER `test_update` AFTER UPDATE ON `test` 
        FOR EACH ROW 
	BEGIN
               UPDATE `log`.`test` 
	       SET 
	       name=NEW.name  
	       WHERE id = OLD.id;
        END;$$
DELIMITER;

更新test数据:
update test set `name` = 'rain' where id =2;

查询log数据库test表:
mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | donald |
|  2 | rain   |
+----+--------+
2 rows in set
创建删除触发器:
DELIMITER $$
    USE `test`$$
    DROP TRIGGER  IF EXISTS  `test_delete` $$
    CREATE
        TRIGGER `test_delete` AFTER DELETE ON `test` 
        FOR EACH ROW 
	      BEGIN
               DELETE FROM `log`.`test` WHERE id = OLD.id;
        END;$$
DELIMITER;

删除数据:
DELETE FROM test WHERE id = 2;
查询log数据库test表:
mysql> select * from test;
+----+--------+
| id | name   |
+----+--------+
|  1 | donald |
+----+--------+
1 row in set
总结:
从测试结果来看,触发器完成复制功能,关键是表中要有主键,利用mysql的同步策略和触发器,可以实现循环复制,及数据整合的功能

0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics