2017-05-25 84 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