有一張桌子。沒有PK,2 FK,有一些任意數量的列。 不幸的是FK在任何方面都不是唯一的。可更新的主要或獨特的鑰匙
添加新數據很容易。
刪除數據(找到一行)是好的,如果我把一個獨特的約束其他col。
(DELETE ... WHERE fk1=:fk1 AND fk2=:fk2 AND ucol=:ucol
)
如何處理UPDATE
?
我不能使用那個ucol,因爲同樣的ucol可能是變化的主題。我有幾個解決方案,但沒有一個看起來不錯。
解決方案1:
把PK放在表中。將其用於DELETE和UPDATE。刪除會造成很多漏洞,但這沒有問題。從理論上講,如果發生一些重大的刪除操作,它可能會用完PK號(int,unsigned int)。
Solution1a 使CK(fk1,fk2,某個新col)用於定位該行。和使用PK一樣。
溶液2
與microtime中/散列/唯一的密鑰生成器/使用的東西時間戳來填充新的獨特的山坳。該col用作PK來定位UPDATE和DELETE行。只有當獨特的算法才能完美地工作時,它纔是絕佳的。
我的問題: 有什麼更好的嗎?這不需要花哨的算法,並且不會有自動遞增PK溢出的風險...
-----------------編輯-------- --------
Solution2a
使用mysql UUID!它比創建自定義時間戳/散列/ something_unique好得多(也更容易使用)。
沒有更多的上下文很難回答。你怎麼能耗盡4 + 10億* PK? – rlanvin
我說'理論上',我沒有:)如果那是當前人類知識的高峯,我會使用PK。但如果不是,我很想知道更好的解決方案。 – CoR
如果你擔心溢出一個整數PK,你總是可以使用一個GUID,但我會堅持標準的自動增量,除非你非常確定你會溢出 –