C# 在PostgreSQL数据库列中查找最低可用编号
我有这个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 |
---------------------------------
| 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不能给出正确的结果。