抜けのない連番を振る

パフォーマンスは無視する方向で。あとSQL Serverでしか試してない。

  • no_misssing_seqに抜けのない連番を格納することにする
  • DBに挿入された相対時間を判定するために、自動採番されるidを使用
  • INSERT時には未確定データと言うことで、-1を入れておく
  • INSERTしたデータが確定したら、no_missing_seqに連番を設定する
  • DELETEは考えない(途中のレコードがDELETEされるとその番号は抜けになる)
UPDATE SomeTable SET
    no_missing_seq =
      (SELECT COALESCE(MAX(no_missing_seq), 0) FROM SomeTable) +
        (SELECT
            COUNT(*)
        FROM
            SomeTable C
        WHERE
            C.id < SomeTable.id AND
              C.no_missing_seq = -1)
WHERE
    no_missing_seq = -1


あまりきれいなやり方じゃないけど、DELETEと同じトランザクションで以下のUPDATE文を実行すればno_missing_seqが振り直される。

UPDATE SomeTable SET
    no_missing_seq =
      (SELECT COUNT(*) FROM SomeTable C WHERE C.id < SomeTable.id)

ただ、no_missing_seqがどこからも参照されていないようにしないと、矛盾が起こるかパフォーマンスがやばいことになるかの二択になる。