|
3
|
| Xavier Dury · 技术社区 · 8 年前 |
|
1
1
你的评论“…我想避免并发问题”让我想到。 为什么不尝试插入一个随机数,注意重复的违规行为,然后重试直到成功?即使是一个查找可用数字的非常聪明的解决方案,也可能在两个单独的会话中找到相同的新数字。因此,只有插入并提交的预订号码才是安全的。 |
|
|
2
1
可以在子查询中移动connect by子句:
你可能会做如下的事情:
但在检查任何一个值之前,它会生成所有100个随机值,这有点浪费;而且由于您可能在这100个值中找不到一个缺口(在这100个值中可能有重复的值),所以您要么需要一个更大的范围,这也很昂贵,尽管不需要这么多的随机调用S:
或者重复一次检查,直到找到匹配项。 另一种方法是用一个列来查找所有可能的ID,该列指示它们是被使用还是空闲的,可能是与位图索引一起使用;然后用它来查找第一个(或任何随机的)空闲值。但是,您也必须维护该表,并在使用和释放主表中的ID时进行原子更新,这意味着使访问变得更加复杂和序列化——尽管如果不想使用序列,您可能无论如何都无法避免这种情况。您可能可以使用物化视图来简化事情。 如果你有一个相对较少的间隙(并且你真的想要重用那些间隙),那么你可能只能在指定的范围内搜索一个间隙,然后如果没有间隙就返回到序列器。假设您当前使用的值范围只有1到1000,但有一些丢失;您可以在该1到100范围内查找一个自由值,如果没有,则使用序列获取1001,而不是始终在间隙搜索中包含整个可能的值范围。这也将填补空白,而不是扩大使用范围,这可能有用,也可能不有用。(我不确定“我不需要那些数字是连续的”是否意味着它们应该 不 是连续的,或者没关系)。 除非您特别需要业务来填补空白,并且要使分配的值不连续,否则,我只需要使用一个序列并忽略空白。 |
|
|
3
1
我设法通过以下查询获得了正确的结果,但我不确定这种方法是否真的是可取的:
|
|
|
maddy · 如何根据oracle SQL中的某一列值进行排名 3 年前 |
|
|
kiric8494 · 显示以元音开头和结尾的城市名称 4 年前 |
|
|
Franz Biberkopf · Oracle:组合子查询和聚合函数 4 年前 |
|
|
BitLauncher · 甲骨文-如何模拟位列和布尔和/或? 4 年前 |
|
|
Arifullah · 如何从oracle中的列中删除特定的初始字符? 4 年前 |
|
|
Anar · Oracle SQL用户定义函数 4 年前 |
|
|
user1312312 · 如何为一组表编写通用触发器? 4 年前 |