PostgreSQL在索引列中获取漏洞

PostgreSQL在索引列中获取漏洞,postgresql,Postgresql,我想在一个表中查询不存在的数据并不容易,但这里可能有一些技巧可以在一个整数列(rowindex)中实现漏洞。 下面是一个小表格,用于说明具体情况: DROP TABLE IF EXISTS examtable1; CREATE TABLE examtable1 (rowindex integer primary key, mydate timestamp, num1 integer); INSERT INTO examtable1 (rowindex, mydate, num1) VA

我想在一个表中查询不存在的数据并不容易,但这里可能有一些技巧可以在一个整数列(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;
通过显示的查询,我将列出所有使用过的索引。
但我想得到(比如)前五个缺失的索引,这样我就可以使用它们在所需的行索引处插入新数据。
在具体示例中,结果将是:2、4、8、9、12表示未使用的索引

这里有没有什么技巧来构建一个查询,它将给出n个缺失索引?

实际上,这样的表可能包含许多行,“洞”可以在任何地方。

您可以通过使用
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;
或者
不存在
查询:

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()
使用了一个硬编码的下界,这样您还可以检测到小于最小值的行索引缺失。

这对您有用吗?一个选项是,加入来自
generate_series(1,MAX(rowindex)
的输出:谢谢各位。generate_series似乎是我们想要的解决方案。哇!非常有趣而且完全可行,两个例子都有!我必须学习我以前从未使用过的“generate_series”。我也希望这能在大量数据上工作。谢谢。