0

我有一个具有这种结构的表:

ID   NAME   RANK
10    A      1
11    A      2
12    A      3
13    A      4
14    B      1
15    B      2

这个表很大,每分钟插入大约 500 行。为了保持每个组的顺序,按名称,我们使用了一个插入前触发器,如下所示:

begin

    SELECT NVL(MAX(RANK+1),1) INTO RANK FROM tablename
    WHERE NAME=:NEW.NAME;

end;

这很好用,但有时它会返回不正确的值,例如 (14,8,11,4,5) 而不是 (1,2,3,4,5)。我们调查了我们的代码,所以我们没有更新这个专栏。

可能是什么问题呢?如果这种排名方法是错误的,那么最好的方法是什么?

4

1 回答 1

1

正如我在评论中所说,我认为没有理由认为价值高于预期。所以我实际上无法回答你原来的问题。

但是,我建议您改用序列,正如我在上面的评论中提到的那样。保证序列可以与并发访问一起使用,而您的方法不是。要获得最后连续的值,您可以使用聚合函数:

select name, row_number() over (partition by name order by seq_no) as rank_no
from tablename; 

您可以创建一个视图,隐藏 seq_no 并且只显示 rank_no。因此,您的客户会得到他们想要看到的东西。

于 2013-11-09T09:20:38.833 回答