我正在检查我的数据库,我想知道有多少主键从我的表中丢失。有时我只有一个主键,那就是整数,这很简单,
我看了这个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/