手動で割り振るにしても、既存の値に近い値にしていれば、見過ごしていたかもしれません。
photo credit: jimgris via photopin cc
現象
正しく登録番号を割り振っていたシステムが、途中から同じ番号を割り振るようになっていました。原因
プログラムとデータベースを確認すると、登録番号のカラムとは別にシリアル型のカラムがありました。プログラムは、
- シリアル型のカラムが最大値の行を検索する。
- 該当行の登録番号のカラムを取得する。
- 登録番号に1を加算して、新しい登録番号を求める。
となっていました。
途中までは正しく割り振っていたのでなぜだろうとデータベースを確認していると、シリアル型のカラムの値が、自動で割り振った値とは思えない大きな値の行がありました。
部下に確認してみると、プログラムを使わずデータを登録することになり、重複しないように大きな値を手動で割り振ったとのことでした。
手動で割り振った値が、下の表のようにシリアル型のカラムの値の最大値にずっとなっていたのが原因でした。
この状態では、同一行が毎回検索されて、同一の登録番号を取得して、新しい登録番号も同一になります。
シリアル型のカラム | 登録番号のカラム |
---|---|
100 | R50 |
101 | R52 |
102 | R52 |
200 | R51 |
対策
シリアル型のカラムを正しく割り振ればプログラムを直さなくても済みそうですが、正しく割り振る自信はありません。行数と登録番号は一致するので、行数を求めて新しい登録番号を求めるようにプログラムを修正しました。
シリアル型のカラムは、手動で設定しないということが暗黙知だと僕の中では思っていなかったので、あまり話したことがなかったかもしれません。