我有一个名为 BoxPeg 的链接表,它将一系列 Pegs 绑定到 1 个 Box。
问题是 Pegs 是有序的,并且在客户端软件中被视为一个数组。
所以我们在 BoxPeg 表中有一个名为 'position' 的 INT UNSIGNED 列。
每次有人将 Peg 添加到 Box 时,我们都会这样做:
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
我知道我可以在这两行之前的单独 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