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. 如果有这个有办法)
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. 如果有这个有办法)
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跟这个是一样的。