我们开始使用基于语句的复制,发现它破坏了SQL_CALC_FOUND_ROWS和FOUND_ROWS(),我正在寻找解决方法。 2007年的错误报告中的评论建议使用SELECT SQL_CALC_FOUND_ROWS INTO @found_rows FROM foo
,但这似乎不起作用。 MySQL说语法无效。
答案 0 :(得分:1)
如果您使用的是旧版本的MySQL,则可能是您问题的一部分:http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_found-rows
未复制FOUND_ROWS() 可靠地使用基于语句的 复制。从MySQL开始 5.1.23,使用基于行的方式自动复制此函数 复制。
修改:仅当您处于MIXED
模式时,以上情况才有效。
此外,正确的解决方法语法是:
SELECT SQL_CALC_FOUND_ROWS * FROM foo;
SET @found_rows = FOUND_ROWS();
SQL_CALC_FOUND_ROWS
不返回任何内容,它只是告诉MySQL计算查询中找到的行数,即使LIMIT
子句阻止所有行返回到客户端。然后,FOUND_ROWS()
可用于返回SQL_CALC_FOUND_ROWS
临时存储的值。
修改:上述解决方法背后的想法(如MySQL bug 12092中所述):
存储FOUND_ROWS()的结果 进入用户变量并使用它 相反的方式。这将复制 正确甚至在基于陈述的情况下 复制,因为它会写一个 User_var进入二进制日志。