Mysql

避免跨表的唯一鍵衝突

  • November 25, 2014

這可能與數據倉庫的想法有關,但我不確定,儘管這是極端理論。

我們有一個表,首先將記錄寫入其中,我們稱它為tbl_recording

CREATE TABLE tbl_recording ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(45) NULL, registration VARCHAR(45) NULL, legacyid VARCHAR(45) NOT NULL, UNIQUE INDEX legacyid_UNIQUE (legacyid ASC), PRIMARY KEY (id));

然後,我們有基於tbl_recording這樣的年表tbl_recording_2012tbl_recording_2013等等,它們的結構是相同的。

我們還tbl_recording每小時將數據放到年度表中(插入到年度,從記錄中刪除)。現在,我看到的問題是legacyid在所有這些表中都沒有記住的唯一性。因此,雖然我們為 legacyid 生成雜湊,但在某些時候可能會發生衝突(即使極不可能):

  1. tbl_recording相同的雜湊中刪除數據後,可能會生成並重新輸入tbl_recording,從而在嘗試插入年表時進一步導致阻塞
  2. 在幾年之間,可以為 2013 年和 2014 年生成相同的雜湊 **編輯:**如果我將年份附加到雜湊中,這將永遠不會發生

我想出的最好的解決方法是保留一個雜湊表,它儲存所有創建的雜湊,並在插入記錄之前進行檢查,然後將新的雜湊插入雜湊表。

是否有更好的解決方案,或者這是唯一真正的解決方案?

編輯:我創建了一個關於我的系統如何工作的範例的 SQL Fiddle

http://sqlfiddle.com/#!2/231fa/1

假裝:tbl_data_2012永遠不會再被寫入。 tbl_recording不斷被寫入,但每隔一小時左右,它就是被清空的內容tbl_data_2013tbl_recording已經將它的內容轉儲到了,tbl_data_2013所以當第 4 條記錄被寫入時,之前沒有任何內容,因此它創建了一個新的legacyid,但是它legacyid已經存在於tbl_data_2013

您應該按年分開表以獲得更快的插入、更新或刪除,因為我們預計此表中有很多很多很多很多很多的記錄。

*但是…您的問題正是為什麼在元數據上分隔表(您的問題中的年份)是一種 SQL 反模式的原因,您不可能給我們一個更好的案例

如果您想要更好的解決方案,您應該閱讀有關 mysql 分區的資訊,請參閱http://dev.mysql.com/doc/refman/5.5/en/partitioning.html

我不知道 MySQL 的來龍去脈,因為我自己是 SQL Server 人,但是將數據拆分為年度表的原因是什麼?

我正在考慮用表分區做一些事情,你在這一年進行分區。這將使您能夠將所有數據一起保存在一個邏輯表中並強制執行唯一性,並使您能夠分散每個分區的物理位置。

這也將簡化報告之類的事情。

引用自:https://dba.stackexchange.com/questions/53196