PostgreSQL在索引列中获取漏洞

时间:2015-12-24 10:46:27

标签: postgresql

我想在查询表中查找不存在的数据并不容易,但这可能是在一个整数列(rowindex)中实现漏洞的一些技巧。
这是用于说明具体情况的小表:

DROP TABLE IF EXISTS examtable1;
CREATE TABLE examtable1 
   (rowindex integer primary key, mydate timestamp, num1 integer);

INSERT INTO examtable1 (rowindex, mydate, num1)
VALUES (1,  '2015-03-09 07:12:45', 1),
       (3,  '2015-03-09 07:17:12', 4),
       (5,  '2015-03-09 07:22:43', 1),
       (6,  '2015-03-09 07:25:15', 3),
       (7,  '2015-03-09 07:41:46', 2),
       (10,  '2015-03-09 07:42:05', 1),
       (11,  '2015-03-09 07:45:16', 4),
       (14,  '2015-03-09 07:48:38', 5),
       (15, '2015-03-09 08:15:44', 2);


SELECT rowindex FROM examtable1;

使用show query我会列出所有使用过的索引 但我想得到(比方说)错过的前五个索引,以便我可以使用它们在所需的rowindex上插入新数据。
在具体的例子中,结果将是:2,4,8,9,12,它们代表未使用的索引。

这里有什么技巧可以构建一个能够提供n个缺失索引的查询吗? 实际上,这样的表可能包含许多行,“孔”可以在任何地方。

1 个答案:

答案 0 :(得分:3)

您可以使用generate_series()生成所有数字的列表,然后检查表格中不存在哪些数字。

这可以使用外部联接来完成:

select nr.i as missing_index
from (
  select i
  from generate_series(1, (select max(rowindex) from examtable1)) i
) nr
  left join examtable1 t1 on nr.i = t1.rowindex
where t1.rowindex is null;

not exists查询:

select i
from generate_series(1, (select max(rowindex) from examtable1)) i
where not exists (select 1 
                  from examtable1 t1
                  where t1.rowindex = i.i);

我使用了generate_series()的硬编码下限,这样你也可以检测到一个小于最小数字的缺失rowindex。