如何摆脱写入二进制日志的#34;不安全语句"消息

时间:2017-04-17 15:51:23

标签: mysql

我正在执行一个简单的UPDATE语句,根据HTMLEmailLog表中具有指定ID的记录更新Contact表中的字段。这是查询:

UPDATE Contact AS c 
INNER JOIN HTMLEmailLog AS h ON c.CustomerID = h.MemberID and c.Email1 = h.Email        
    SET c.ValidEmail1 = 'N'
WHERE h.id = 160605 ; 

我收到警告:

上次查询的警告: 注意:使用语句格式将不安全语句写入二进制日志 因为BINLOG_FORMAT = STATEMENT。写入带有表的表的语句 从另一个表中选择后自动增加列是不安全的,因为 检索行的顺序决定了哪些行(如果有的话) 书面。这个订单无法预测,可能在主人和主人之间有所不同 从属

有人可以解释为什么我会收到此警告信息? 有什么方法可以摆脱这种警告吗? 如果我直接更新联系人表(不使用JOIN),我不会收到警告消息。

感谢。

1 个答案:

答案 0 :(得分:1)

首先,这不是错误消息,这是一个警告。这意味着mysql担心是否可以使用基于语句的复制将update语句准确地复制到从属服务器。

  1. 如果您不使用复制,那么这无关紧要。

  2. 如果您使用复制,请考虑更改replication mode to mixed。在混合模式下,如果检测到可能不安全的语句,mysql将使用基于行的复制而不是基于语句。

  3. 您也可以尝试重写更新以使用子查询而不是连接来指示只更新contact表:

    UPDATE Contact AS c         
    SET c.ValidEmail1 = 'N'
    WHERE (c.CustomerID, c.Email1) IN (SELECT MemberID, Email FROM HTMLEmailLog WHERE id = 160605);