一連のペグを1つのボックスに結び付けるBoxPegというリンクテーブルがあります。
欠点は、ペグが順序付けられ、クライアントソフトウェアで配列として扱われることです。
したがって、BoxPegテーブルに「position」というINTUNSIGNED列があります。
誰かがボックスにペグを追加するたびに、これを行います。
UPDATE BoxPeg SET position = position+1 WHERE box = '{BOXID}' AND position >= {NEWPEGPOSITION};
INSERT INTO BoxPeg(box, peg, position) VALUES('{BOXID}', '{PEGID}', {NEWPEGPOSITION});
これは、クライアントが大きすぎる新しいペグ位置をなんとか通過するまで正常に機能します。
before:
0
1
2
3
after insert 9
0
1
2
3
9
これらの2行の前の別のSQLステートメントでMAX(position)WHERE box ='{BOXID}'を取得し、それに基づいて新しいペグ位置を調整できることはわかっていますが、シリーズ全体を単純にリフローしたいと思います。インサート後のワンショット。このようにして、シリーズの最初から最後までどこにもギャップがないことを100%確信しています。
そのUPDATEはどのようになりますか?
この状況を考えてみましょう。
before:
0
2
5
8
after insert 5
0
2
5
6
9
after reflow
0
1
2
3
4