2015-12-31 97 views
3

我有一個包含9百萬條記錄的表。我定期將這些數據同步到第三方。我保留一個列,告訴特定行是否已經同步。Rails 3 - delete_all不支持限制範圍,而MySQL支持它

現在我需要刪除幾乎6 million同步行,如果運行

Model.where(:sync_flag => true).delete_all 

將是一個不錯的想法我不知道。每秒鐘有數百個插入,我認爲這可能會導致鎖定表的方式會傷害/阻塞插入(MySQL專家需要在這裏糾正)

通過上面的序言,我想到了使用刪除在一個循環的限制條款,刪除所有記錄,直到沒有剩下,但有以下

Model.where(:sync_flag => true).limit(5000).delete_all 

它提出了一個異常delete_all doesn't support limit scope

有沒有解決方案來解決這個問題而不離開Rails環境?

回答

2

ActiveRecord::Base.connection.send(:delete_sql,'delete from <table name> where sync_flag = true limit 1000')

你必須使用send因爲 'delete_sql' 是受保護的,但這個工程。

另一種解決方案可能是

Model.connection.exec_delete('DELETE FROM <table name> where sync_flag=true LIMIT 10000', 'DELETE', [])

它會返回受影響的行,也將通過軌道記錄器記錄的查詢。

1

如何執行此SQL命令?

Model.connection.exec_delete('DELETE FROM models WHERE sync_flag = 1 LIMIT 5000', 'DELETE', []) 
+0

當我嘗試你的解決方案時,MySQL拋出了這個錯誤'這個版本的MySQL還不支持'LIMIT&IN/ALL/ANY/SOME子查詢' –

+0

它是Percona Server 5.6。 25。 –