找到缺少的varchar主键

时间:2017-05-25 00:20:17

标签: sql sql-server postgresql primary-key

我正在浏览我的数据库,我想知道我的表中缺少多少主键。现在有时我只有一个主键是整数,这很容易, 我查看了这个https://www.youtube.com/watch?v=V00p-TgQML0,但它是用于数字列。

我从SO本身得到了以下解决方案,如果PK是整数,它会有所帮助。 只选择PK到一个文件我通过它来找到下一个缺失的序列

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

现在我的问题围绕着varchar主键。就像一个订单参考号或许不是一个顺序增加的整数但是一个字符串/ varchar / alphanumeric列有任何人已经尝试过这个。 (像A123Z43这样的值),在整数/数字中很容易,我加1,然后我得到下一个序列。

我不确定,但它只是让我感到震惊,一把钥匙和下一把钥匙的散列会与它有什么关系。我会看看我是否可以尝试。

如果我有两列作为主键,一个是数字,另一个是varchar,这将变得更复杂。

我目前正在使用SQL Server和Postgres。

1 个答案:

答案 0 :(得分: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