我正在检查我的数据库,我想知道有多少主键从我的表中丢失。有时我只有一个主键,那就是整数,这很简单,
我看了这个SQL: find missing IDs in a table但它是针对数字列的。
我从SO本身得到了下面的解决方案,如果PK是整数,它会有帮助。
只选择PK到一个文件中,我通过它寻找下一个丢失的序列

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

现在我的问题是围绕varchar主键。就像订单参考号,它可能不是一个顺序递增的整数,但是string/varchar/alphanumeric列已经有人尝试过了。(一个像A123Z43这样的值),在整数/数字中很容易,我加1得到下一个序列。
我不确定,但我突然想到,一把钥匙和另一把钥匙的杂碎会不会和它有关。我看看能不能试试。
如果我将两列作为主键,一列是数字,另一列是varchar,这将变得更加复杂。
我目前正在使用SQL server和Postgres。

最佳答案

您检查的不是缺少PK值,而是序列间隙。如果PK在文本上,则只能为默认值定义规则。如果PK列没有默认值,则不能检查间隙。在PK中有两个值:“C12”和“$D”-那么您错过了什么?.. 它是从字面开始的吗?从数字开始?有空位吗?等等。
现在,如果您定义了某种规则,您可以生成序列,然后加入它-检查间隙。如:

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

关于sql - 查找丢失的varchar主键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44170400/

10-13 07:40