在PostgreSQL数据库列中查找最低可用数量

时间:2016-03-08 12:55:51

标签: c# .net winforms postgresql npgsql

我有这个PostgreSQL表

---------------------------------
|  id   |   tag   |  name  |
---------------------------------
|  1    |    1    |  name1 |
|  3    |    3    |  name3 |
|  4    |    4    |  name4 |
|  6    |    6    |  name6 |
|  7    |    7    |  name7 |

此表保存客户编号:id是自动增量主键。 tag是一个唯一的整数,它可以作为在数据库中查找人员的简便方法。由于一些实际问题,人们经常离开该地区,永远不会再来。在任何给定时间,客户总数从不超过200,但转换相对较快。 因为标签号是在程序中手动输入的并且必须由客户记忆,我想保持标签号非常小,所以当我删除一个客户时我想重复使用它的标签号。

在上面的表中,id#2和5的客户不久前被删除了。现在我即将插入一个新客户,并希望数据库为我找到可用的最低标签号(在这种情况下它将是#2),以便我可以将其重新用于下一个客户。

怎么样?

最新的NpgSQL 3.0.5和PostgreSQL 9.5

2 个答案:

答案 0 :(得分:1)

使用ROW_NUMBER(),你应该可以很快地完成它;

SELECT rn tag                                                   
FROM (SELECT tag, ROW_NUMBER() OVER (ORDER BY tag) rn FROM Table1) z 
WHERE rn != tag                                                                 
ORDER BY rn OFFSET 0 ROW FETCH NEXT 1 ROW ONLY;

它基本上以数字顺序获取标签及其行号,并返回与其行标签不匹配的第一个行号(即如果标签1,2,4存在,则它们将获得行号1,2 ,3和3是第一个与其标签不匹配的行号,4)

An SQLfiddle to test with

但请注意,在数据库中设置标签是唯一的并准备重试,如果有2个人同时添加客户,则两个人都将获得最低的标签,但只允许设置一个它在他们的客户身上。否则两个客户可能会得到相同的标签,这可能是坏事。

答案 1 :(得分:1)

Func

SQL Fiddle