我有一个MySQL主从配置。
在两台服务器上,我都有两个表:table1
和table2
我在两台服务器上都具有以下触发器:
Trigger: test_trigger
Event: UPDATE
Table: table1
Statement: insert into table2 values(null)
Timing: AFTER
table2
的结构如下:+-------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
+-------+---------+------+-----+---------+----------------+
问题在于,在
MySQL 5.1.*
上,当从属调用触发器时,它会添加在主控上插入的ID,而不是它应根据自己的auto_increment值插入的ID。假设我有以下数据:
在大师:
SELECT * FROM table2;
Empty set (0.08 sec)
在从站上:
SELECT * FROM table2;
+----+
| id |
+----+
| 1 |
+----+
1 row in set (0.00 sec)
(只需忽略从站不是主站的完整镜像的事实)
在上述情况下,当我在Master上的table1中更新一行时,从站停止并返回错误:
查询中的键“ PRIMARY”错误“重复项'1”。
我不明白为什么奴隶试图插入一个特定的ID。
很奇怪,在
MySQL 5.0.*
上没有发生这种情况。 最佳答案
如果可能,请切换到基于行的复制。
除了基于语句的复制的最基本情况外,自动增量几乎无法解决任何其他问题。
对于任何产生多个auto_increment值(通过触发器,多行插入等)的语句,只有第1个auto_increment值在从属设备上总是正确的(仅记录第1个)。
如果从站从日志中读取了一个auto_increment值,但未“使用”该值,则该值将用于下一条语句(这可能是完全不相关的)。当从站出于某种原因(在配置中忽略表/ db,在proc / trigger中有条件地插入等)而跳过相应的insert语句时,就会发生这种情况。
我在审核日志类型表中遇到了类似的问题(触发器对table1的每次更改都会在table2中插入一个事件),以及其他一些与自动增量相关的问题。
我不确定此解决方案是否适合您的情况,但为了以防万一,我将发布此解决方案:
在表1中添加一个“ updated_count”字段。它从0开始(在插入时),并在每次更新时增加1(使用INSERT / UPDATE触发器)。
删除table2的auto_increment并将其PK更改为复合键(table1_pk,table1_update)
。然后在table2 PK的AFTER INSERT / UPDATE触发器中使用table1的PK和'updated_count'。
关于mysql - MySQL 5.1。*奇怪的触发器复制行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23055989/