我正在执行一个简单的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),我不会收到警告消息。
感谢。
答案 0 :(得分:1)
首先,这不是错误消息,这是一个警告。这意味着mysql担心是否可以使用基于语句的复制将update语句准确地复制到从属服务器。
如果您不使用复制,那么这无关紧要。
如果您使用复制,请考虑更改replication mode to mixed。在混合模式下,如果检测到可能不安全的语句,mysql将使用基于行的复制而不是基于语句。
您也可以尝试重写更新以使用子查询而不是连接来指示只更新contact
表:
UPDATE Contact AS c
SET c.ValidEmail1 = 'N'
WHERE (c.CustomerID, c.Email1) IN (SELECT MemberID, Email FROM HTMLEmailLog WHERE id = 160605);