4

我偶然发现了一个有趣的 MySQL 错误消息,我真的不知道如何解释。

设置:

  • 有两个表 A 和 B。
  • 当在表 A 中写入或更新数据时,触发器正在将数据写入表 B。
  • 操作发生在 Master 数据库上
  • 数据被复制到从服务器

现在,每当我决定更新表 A 中的数据时,它就会被更新并将相应的日志消息写入表 B。然而,MySQL 会产生以下错误消息:

注意:#1592 使用语句格式写入二进制日志的不安全语句,因为 BINLOG_FORMAT = STATEMENT。该语句是不安全的,因为它使用了 LIMIT 子句。这是不安全的,因为包含的行集无法预测。

注意:#1592 使用语句格式写入二进制日志的不安全语句,因为 BINLOG_FORMAT = STATEMENT。语句是不安全的,因为它调用插入到 AUTO_INCREMENT 列中的触发器或存储函数。无法正确记录插入的值。

注意:#1592 使用语句格式写入二进制日志的不安全语句,因为 BINLOG_FORMAT = STATEMENT。从另一个表中选择后写入具有自动增量列的表的语句是不安全的,因为检索行的顺序决定了将写入哪些(如果有)行。此顺序无法预测,并且可能在主从服务器上有所不同。

没有什么令人高兴的。我怎样才能避免这些?

4

2 回答 2

1

简短的回答——>不要在触发器中将数据插入到带有 auto_increment 列的表中,而是使用 mysql 的本机函数来创建唯一 ID。这些被很好地复制并且不会产生警告。

于 2013-06-05T10:38:39.447 回答
1

在 Google 讨论组“percona-discussion”中查看此电子邮件交流。

注意:我为 Percona 工作。

于 2013-05-17T19:01:01.510 回答