我正在研究一個數據庫系統,其中有一個主表bd &表和許多從屬表,並且銷售需要從主表中同步它們的數據。MySQL行散列
關於這種安排的一些觀點: 1)slave db(S)會不時脫機,所以當他們再次起牀時,服務會「同步」它們。 (所以沒有複製) 2)我不能改變主數據庫,所以不觸發。 (想象主數據庫不屬於我) 3)同步將發生在一個服務和速度並不重要。 4)沒有大量的數據 - 所以我甚至可以走過每一行。 5)行中的數據變化很大,從varchar(3)到varchar(500)
我四處張望,發現Md5() - 這個我覺得很棒,因爲那時我可以只用CONCACT()行值和行對行比較。我發現的問題是CONCAT(和GROUP_CONCAT)有一點限制,因爲它有一個字符限制。
獲得「排」CHECKSUM或HASH的最佳方式是什麼?
CHECKSUM ROW WHERE id = 1會很棒......最接近這個的是什麼?
更新: 我設法得到該「SELECT @@ group_concat_max_len;」返回最大值(4294967295)。但是這個代碼仍然不起作用:
SELECT id, MD5(GROUP_CONCAT(MD5(`id`), ...many columns here... ,MD5(`col30`))) AS 'md5Hash' FROM company_table GROUP BY id;
它仍然只適用於少數幾列。
您可以使用'group_concat_max_len'變量增加'group_concat'的字符數限制,有效地使它與系統最大限度地支持的一樣大。 – bishop
如果它是一個服務,你可以處理服務中的所有內容,並且如果你不能像bishop建議的那樣設置'group_concat_max_len',就可以在代碼中連接的返回結果上運行散列。正如你所說的,速度無關緊要,這將爲你帶來理想的結果。 –
考慮到你的要求和限制,用MD5(GROUP_CONCAT(..))進行哈希處理似乎對我來說很合理。特別是,請參閱[這個答案](http://stackoverflow.com/a/26733784/2908724)。作爲@FrankJ建議的代碼級解決方案最終可能是最好的方法,因爲它將比數據庫級別的內存更靈活。 – bishop