MySQL触发器

CHANGE MASTER:[url]http://dev.mysql.com/doc/refman/5.5/en/change-master-to.html[/url]
Trigger Syntax and Examples:[url]http://dev.mysql.com/doc/refman/5.7/en/trigger-syntax.html[/url]
NDB Cluster Replication: Multi-Master and Circular Replication:
[url]http://dev.mysql.com/doc/refman/5.6/en/mysql-cluster-replication-multi-master.html[/url]
MySQL触发器Trigger实例篇:[url]http://blog.csdn.net/hireboy/article/details/18079183[/url]
--log-slave-updates:[url]http://dev.mysql.com/doc/refman/5.6/en/replication-options-slave.html#option_mysqld_log-slave-updates[/url]
Mysql主从配置:[url]http://donald-draper.iteye.com/admin/blogs/2337407[/url]
LOCK TABLES and UNLOCK TABLES:[url]https://dev.mysql.com/doc/refman/5.5/en/lock-tables.html[/url]
前面我们讲过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
总结:
[color=blue]从测试结果来看,触发器完成复制功能,关键是表中要有主键,利用mysql的同步策略和触发器,可以实现循环复制,及数据整合的功能[/color]。

你可能感兴趣的:(MySQL)