mysql 触发器双向触发器 
insert 摸索已经实现
CREATE TABLE `a` (
  `id` int(11) DEFAULT NULL,
  `source` char(255) DEFAULT NULL,
  `des` varchar(10) DEFAULT NULL,
  `u` tinyint(4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;DELIMITER ;;
CREATE TRIGGER `a_insert` AFTER INSERT ON `a` FOR EACH ROW BEGIN
IF NEW.id>0 and NEW.source='A' THEN
insert into b values(new.id, new.source,new.des,new.u);
end if;
end;;CREATE TABLE `b` (
  `id` int(11) DEFAULT NULL,
  `source` char(255) DEFAULT NULL,
  `des` varchar(10) DEFAULT NULL,
  `u` tinyint(4) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;DELIMITER ;;
CREATE TRIGGER `b_insert` AFTER INSERT ON `b` FOR EACH ROW BEGIN
IF NEW.id>0 and NEW.source='B' THEN
insert into a values(new.id, new.source,new.des,new.u);
end if;
end;;
DELIMITER ;测试是没有问题。 (可以实现1表新加入数据 另外1表能看到新数据 ,没有循环触发)
例子如下:
 insert a values(4,'A','d',1);
Query OK, 1 row affectedmysql> select * from a;
+----+--------+-----+------+
| id | source | des | u    |
+----+--------+-----+------+
|  1 | A      | eee | NULL |
|  2 | B      | dsf | NULL |
|  3 | A      | d   | NULL |
|  4 | A      | d   |    1 |
+----+--------+-----+------+
4 rows in setmysql> select * from b;
+----+--------+------+------+
| id | source | des  | u    |
+----+--------+------+------+
|  1 | A      | eee  | NULL |
|  2 | B      | NULL | NULL |
|  3 | A      | d    | NULL |
|  4 | A      | d    |    1 |
+----+--------+------+------+
现在头疼的 触发器双向更新 加字段也没有做 ??   
写了 触发器 总是有如下 错误update a set des='ddddd',u=0 where id=4;
ERROR 1442 : Can't update table 'a' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
m---------------------容易导致循环触发
(mysql 有没有这样的函数 ,比如 bool类型bf=0, 使用这个函数后bf=1,再使用这个函数后 bf=0. 如果有这个有办法)

解决方案 »

  1.   

    MYSQL 中无法实现这种触发,因为MYSLQ认为会造成循环触发的风险。
      

  2.   

    已经搞定
    CREATE TRIGGER `a_update` BEFORE UPDATE ON `a` FOR EACH ROW BEGIN
    IF new.id>0 and old.u=new.u THEN
    IF  old.u=0 then
    SET NEW.u= 1;
    else
    set new.u=0;
    end if;
    update b set b.des=NEW.des,b.u=new.u  where b.id=NEW.id;
    end if;
    end;
    通过增加冗余字段 来实现2个库的双向 同步。 并发性没有测试。delete跟这个是一样的。