Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在PostgreSQL数据库列中查找最低可用编号_C#_.net_Winforms_Postgresql_Npgsql - Fatal编程技术网

C# 在PostgreSQL数据库列中查找最低可用编号

C# 在PostgreSQL数据库列中查找最低可用编号,c#,.net,winforms,postgresql,npgsql,C#,.net,Winforms,Postgresql,Npgsql,我有这个PostgreSQL表 --------------------------------- | id | tag | name | --------------------------------- | 1 | 1 | name1 | | 3 | 3 | name3 | | 4 | 4 | name4 | | 6 | 6 | name6 | | 7 | 7 |

我有这个PostgreSQL表

---------------------------------
|  id   |   tag   |  name  |
---------------------------------
|  1    |    1    |  name1 |
|  3    |    3    |  name3 |
|  4    |    4    |  name4 |
|  6    |    6    |  name6 |
|  7    |    7    |  name7 |
此表包含客户编号:id为自动递增主键。标记是一个唯一的整数,它可以作为在数据库中查找人员的简单方法。由于一些实际问题,人们经常离开该地区,再也不来了。客户总数在任何给定时间都不会超过200,但周转相对较快。 由于标签号是在程序中手动输入的,并且必须由客户记忆,因此我希望保持标签号非常小,因此当我删除一个客户时,我希望重用其标签号

在上表中,id为2和5的客户不久前被删除。现在我要插入一个新客户,希望数据库为我找到可用的最低标签号(在本例中为#2),以便我可以为下一个客户重复使用它

怎么做

最新的NpgSQL 3.0.5和PostgreSQL 9.5

以及
行号()
,您应该能够相当快地完成这项工作

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不匹配的第一个行号)

不过要提醒一句,在数据库中设置唯一的标记,并准备重试。如果有两个人同时添加客户,两个人都将获得最低的标记,但只允许一个人在其客户上设置该标记。否则,两个客户可能会得到相同的标签,这可能是不好的。

使用
行号()
,您应该能够相当快地完成这项工作

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;
select tag
from (
    select generate_series (1, (select max(tag) from customer)) as tag
    except
    select tag from customer
) s
order by tag
limit 1
它基本上以数字顺序获取标记及其行号,并返回与其行标记不匹配的第一个行号(即,如果标记1,2,4存在,它们将获取行号1,2,3,3是与其标记4不匹配的第一个行号)

不过要提醒一句,在数据库中设置唯一的标记,并准备重试。如果有两个人同时添加客户,两个人都将获得最低的标记,但只允许一个人在其客户上设置该标记。否则,两个客户可能会得到相同的标签,这可能是不好的

select tag
from (
    select generate_series (1, (select max(tag) from customer)) as tag
    except
    select tag from customer
) s
order by tag
limit 1

可能的重复:可能的重复:这起作用了,我不得不将“偏移量0”更改为“偏移量1”,因为标记从0开始,行号从0开始1@docesam我认为,
…(按标记排序)-1rn来自…
在这种情况下可能会更好。@docesam请看您是否可以使用进行测试。偏移量1没有给出正确的结果。这样,我不得不将“偏移量0”更改为“偏移量1”,因为标记从0开始,行号从0开始1@docesam我认为,
…(按标记排序)-1rn来自…
在这种情况下可能会更好。@docesam请看您是否可以使用进行测试。偏移量1不能给出正确的结果。