2013-09-25 57 views
0

我已經加入了一個項目,它使用客戶端生成的隨機數爲主數據庫中的主鍵字段。這些主鍵字段是自動遞增的,但並未被用於這種情況。Mysql自定義自動增量ID來修復隨機ID

我認爲這樣做是因爲開發人員不知道如何在插入後檢索數據庫生成的id。

我們現在在很多表中都有一個稀疏的id值數組,並且有大量的插入關鍵衝突。

是否有一些補救措施可以讓數據庫生成ID(即從最後一個分配的ID開始,找到下一個可用的ID),並使下面的JDBC調用起作用?

numero = stmt.executeUpdate(query, Statement.RETURN_GENERATED_KEYS); 
+0

爲了能夠向您推薦一些實用的東西,您必須更加具體,並從發佈當前表架構開始,並指定您當前使用的引擎。 – peterm

+0

@peterm。好,謝謝。數據庫包含大約120個表(對許多枚舉),每個實體表包含一個代理主鍵,通常是int(10)非空auto_increment。目標數據庫是MySQL 5.1.69。 id在整個id範圍間隔很大,即大的間隙。 jdbc客戶端是最新的。現有的代碼很可怕,有許多錯誤和相應的數據質量問題。我正在尋找可行的建築建議。例如。實現一個存儲過程,更新這個mysql的最後id元數據字段等。希望有人遇到過這個,並修復它? – karu

回答

0

我想如果你搜索谷歌的'從序列MySQL生成數據庫主鍵'它會有所幫助。

使用序列:查找給定表中最大的主鍵,並創建一個從最大的主鍵值開始遞增1的序列。爲每個表創建一個單獨的序列。請注意,您正在讓數據庫生成密鑰,因此您必須禁用程序或客戶端生成密鑰。

或者,您可以創建一個全新的數據庫模式,以正確實現主鍵生成。然後將數據從舊數據庫遷移到新數據庫,在子表之前填充父表。然後,基於舊的priamry鍵,以編程方式將父項與子記錄匹配。但是,我認爲這對於數據庫的大小來說是非常耗時的。

+0

謝謝。由於隨機傳播,某些表的當前max(id)已經接近可用id範圍的頂部,所以我需要進行模式更改以增加字段大小。沒有doco/domain模型,id是許多其他表中的外鍵,所以如果我錯過了一個外鍵字段模式更改 - 事情就會崩潰。話雖如此,我認爲增加字段長度並從max(id)+1開始可能是我的最佳選擇。 – karu