Bạn sẽ có thể thực hiện việc này trong một truy vấn:một cái gì đó dọc theo các dòng của UPDATE foo SET sort_index = sort_index + 1 WHERE bar_id == b AND sort_index < s1 AND sort_index >= s2
, trong đó b
là bar_id
của hàng sẽ được di chuyển, s1
là sort_index
hiện tại của hàng đó và s2
là sort_index
bạn muốn chuyển nó đến. Sau đó, bạn chỉ cần thay đổi sort_index
của hàng.
Bạn có thể muốn thực hiện hai truy vấn trong một giao dịch. Ngoài ra, nó có thể tăng tốc độ nếu bạn tạo chỉ mục trên sort_index
bằng cách sử dụng một cái gì đó như CREATE INDEX foo_index ON foo (sort_index)
.
(Nhân tiện, ở đây tôi giả sử rằng bạn không muốn sort_index
trùng lặp các giá trị trong bar_id
nhất định và thứ tự tương đối của các hàng không bao giờ được thay đổi ngoại trừ một cách rõ ràng. Nếu bạn không cần điều này, giải pháp thậm chí còn đơn giản hơn.)