2017-05-25 65 views
1

我正在查看我的數據庫,我想知道我的表中缺少了多少個主鍵。現在有時我只有一個主鍵是整數,這很容易, 我看着這個SQL: find missing IDs in a table,但它是數字列。查找丟失的varchar主鍵

我從SO本身得到了下面的解決方案,它有助於防止PK是整數。 選擇只有PK到我通過它awk的一個文件來尋找下一個丟失的序列

gawk '$1!=p+1{print p+1}{p=$1}' 

現在我的問題圍繞的VARCHAR主鍵周圍。像一個訂單參考號也許不是一個順序遞增的整數,而是一個字符串/ varchar /字母數字列已經有人試過了。 (像A123Z43這樣的值),整數/數字很容易,我加1,然後得到下一個序列。

我不確定,但它只是打擊了我,一個密鑰的散列和下一個有什麼關係。我會看看我是否可以嘗試。

這將變得更加複雜,如果我有兩列作爲主鍵一個是數字,另一個是varchar。

我現在正在使用SQL Server和Postgres。

回答

0

您正在檢查不缺少PK值,而是序列差距。在文本上PK的情況下 - 只有您可以定義默認值的規則。如果您沒有PK列的默認值,則無法檢查差距。例如你在PK中有兩個值:「C12」和「$ D」 - 那麼你在這裏錯過了什麼?它是從字面上開始的嗎?從數字?是否允許空間?等等。

現在,如果您有某種規則定義,您可以generate_serie,然後加入它 - 檢查差距。例如:

t=# select chr(g)||n,pk from generate_series(65,100,1) g join generate_series(1,9,1) n on true left outer join (values ('A4'),('B3')) as v (pk) on pk=chr(g)||n limit 19; 
?column? | pk 
----------+---- 
A1  | 
A2  | 
A3  | 
A4  | A4 
A5  | 
A6  | 
A7  | 
A8  | 
A9  | 
B1  | 
B2  | 
B3  | B3 
B4  | 
B5  | 
B6  | 
B7  | 
B8  | 
B9  | 
C1  | 
(19 rows) 

Time: 0.392 ms