我有这个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
答案 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)
但请注意,在数据库中设置标签是唯一的并准备重试,如果有2个人同时添加客户,则两个人都将获得最低的标签,但只允许设置一个它在他们的客户身上。否则两个客户可能会得到相同的标签,这可能是坏事。
答案 1 :(得分:1)
Func