SQL反模式學習筆記22 偽鍵潔癖,整理數據
- 2019 年 10 月 4 日
- 筆記
目標:整理數據,使不連續的主鍵Id數據記錄變的連續。

反模式:填充斷檔的數據空缺。
1、不按照順序分配編號
在插入新行時,通過遍歷表,找到的第一個未分配的主鍵編號分配給新行,來代替原來自動分配的偽主鍵機制。
使用Select Max(Id) + 1 這種查詢語句,會出現並發訪問的問題。
2、為現有數據行重新編號:通常做法是找到主鍵最大的行,然後用最小的未被使用的值來更新它。
缺點:(1)SQL語句比較麻煩;
(2)必須同時更新所有引用了你重新分配了主鍵的行的子記錄;
(3)無法避免產生新的斷檔。
3、製造數據差異
如果別的外部系統依賴於資料庫中的主鍵來定義數據,那麼你的更新操作就會導致那個系統中的引用失效。
重用主鍵不是一個號的注意,因為斷檔往往是由於一些合理的刪除或者回滾數據所造成的。
別因為那些偽鍵看上去是沒用的而重新分配他們。
如何識別反模式:當出現以下情況時,可能是反模式
1、在我回滾了一個插入操作後,要怎麼重用囊而自動生成的標識?
偽鍵一旦生成後不會回滾。如果非要回滾,RDBMS就必須在一耳光事務的聲明周期內生成一個偽鍵,
而這在多個客戶端並發地插入數據時,會導致競爭或者死鎖。
2、bugId為3的這條記錄怎麼了?
3、如何找到第一個未使用的Id?
4、自增長整形id的數字標識如果達到了最大值怎麼辦?
合理使用反模式:
沒有理由要去改變偽鍵的值,由於它的值本身並沒有什麼重要的意義。如果這個主鍵列有實際的意義,那麼這就是一個自然鍵,而不是偽鍵。
解決方案:
主鍵的值必須是唯一且非空的,因而你才能使用主鍵來唯一確定一行記錄,但這是主鍵的唯一約束,
他們不需要一定非得是連續值才能用來標記行。
1、定義行號:使用Row_Number()或者Limit等關鍵字來實現;
2、使用Guid:資料庫全局唯一標識符。
優點:(1)可以再多個資料庫伺服器上並發地生成偽鍵,而不用擔心生成同樣的值。
(2)不存在斷檔的問題。
缺點:(1)Guid的值太長,不方便輸入;
(2)Guid的值是隨機的,因此找不到任何規則或者依靠最大值來判斷哪一行的最新插入的;
(3)Guid的存儲需要16位元組,這比傳統的4自檢整形偽鍵佔用更多的控制項,並且查詢的速度更慢
結論:將偽鍵當做行的唯一性標識,但它們不是行號。