2011-05-24 23 views
0

我們開始使用基於語句的複製,並發現它打破SQL_CALC_FOUND_ROWS和FOUND_ROWS(),我正在尋找一個解決辦法。 2007年的一個錯誤報告的評論建議使用SELECT SQL_CALC_FOUND_ROWS INTO @found_rows FROM foo,但這似乎不起作用。 MySQL說這個語法是無效的。語句複製和SQL_CALC_FOUND_ROWS

回答

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條目寫入二進制日誌。

+0

我們使用的是56年5月1日,但我們並沒有使用基於行的複製,這樣就不會幫助。 – mellowsoon 2011-05-24 23:09:25

+0

@mellowsoon如果您將'SELECT'的語法更改爲我在答案中提供的內容,它是否有效,還是通過基於語句的複製阻止了它? – 2011-05-24 23:11:34

+0

我沒有任何理由認爲它會起作用。我們已經使用'SELECT SQL_CALC_FOUND_ROWS * FROM foo',接着是'SELECT FOUND_ROWS()',並且這不適用於基於語句的複製。 – mellowsoon 2011-05-24 23:19:34