PostgreSQL在索引列中获取漏洞
我想在一个表中查询不存在的数据并不容易,但这里可能有一些技巧可以在一个整数列(rowindex)中实现漏洞。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
下面是一个小表格,用于说明具体情况:
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”。我也希望这能在大量数据上工作。谢谢。