私はこの構造のテーブルを持っています:
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;
これはうまくいくが、(1,2,3,4,5)の代わりに(14,8,11,4,5)といった不正確な値を返すことがある。コードを調べて、この列を更新しませんでした。
何が問題なの?このランク付けの方法が間違っている場合、それを行うための最善の方法は何ですか?
回答:
回答№1は1私のコメントに述べられているように、私は値が予想以上に高いという理由は見当たりません。だから私はあなたの元の質問に実際に答えることはできません。
しかし、代わりにシーケンスを使用することをお勧めします。上記の私のコメントでも述べた。シーケンスは同時アクセスで動作することが保証されていますが、これはあなたのアプローチではありません。最後に連続する値を持つには、そのために集計関数を使用します。
select name, row_number() over (partition by name order by seq_no) as rank_no
from tablename;
seq_noを隠し、rank_noのみを表示するビューを作成することができます。こうしてあなたのクライアントは彼らが見たいものを手に入れます。