如何?正确的sql语法,用于查找下一个可用的标识符

bel*_*ebu 1 sql oracle

我想我可以从更有经验的用户那里使用一些帮助...我在表中有一个整数字段名称,我们在表SO中将其称为SO_ID,并且我需要根据以下内容计算新的SO_ID.规则
1)SO_ID由6个字母组成,其中前3个是区号,最后3个是该区域内的序列号.
309001
309002
309003
2)所以下一个新行的SO_ID值为
309004
3)如果有人删除了SO_ID值= 309002的行,那么下一个新行必须回收这个值,所以下一个新行必须有SO_ID值
309002

任何人都可以请我提供SQL函数或PL/SQL(可能是一个直接的触发?)函数,它将返回我需要使用的下一个可用的SO_ID?我估计我可以在我的sql中使用关键字rownum,但是接下来只是运行不正常

select max(so_id),max(rownum)   from( 
select (so_id),rownum,cast(substr(cast(so_id as varchar(6)),4,3) as int) from SO 
where length(so_id)=6  
and substr(cast(so_id as varchar(6)),1,3)='309' 
and cast(substr(cast(so_id as varchar(6)),4,3) as int)=rownum 
order by so_id 
);
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助!

kur*_*sch 6

这种逻辑充满了危险.如果两个会话计算相同的"下一个"值,或两者都尝试重用相同的"已删除"值,该怎么办?由于你的列是一个整数,你可能最好不要查询"在309001和309999之间",但这引出了一个问题,当你点击区域309中的第1000个项目时会发生什么?

是否可以将SO_ID作为另一个表的外键以及唯一键?您可以使用所有有效ID预先填充父表(或使用函数根据需要生成它们),然后选择不存在子记录的最低值是一件简单的事情.