我有一個MariaDB(想想MySQL)數據庫,其中行有position
字段。此位置可改變,但必須是連續的,並且在開始1更有效的維護數據庫中的行順序字段的方法?
簡表模式:
CREATE TABLE `ordered_data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`owner` int(11) NOT NULL,
`data` varchar(300) COLLATE utf8_unicode_ci NOT NULL,
`position` int(11) NOT NULL
PRIMARY KEY (`id`)
)
因此,例如,用戶可能想用ID10的行移動到位置#1 。這當然需要對所有後續項目重新排序,否則會在position
字段中重複。我不能找出一個方法來做到這一點在少於4個查詢。
我目前的解決方案在下面,它非常簡單,但我不禁感到有更優雅的方式來執行重新排序。在這個例子中,我運動行與ID32,由用戶20,定位3
- 由
SELECT position FROM ordered_data WHERE id = 32
獲取currentPosition
。 - 填補我們即將與
UPDATE ordered_data SET position = position - 1 WHERE position > currentPosition AND owner = 20
之間的差距。 - 用
UPDATE ordered_data SET position = position + 1 WHERE position >= 3 AND owner = 20
爲該行的新位置(3)騰出空間。 - 更新該行的位置以適應差距
UPDATE ordered_data SET position = 3 WHERE id = 32
。
所有建議非常歡迎。將前兩個語句與子查詢結合在一起使MySQL抱怨使用同一個表進行更新和選擇。
每個擁有者不可能有超過10行。
每組10行,我不關心性能,並使用最簡單(最易讀)的解決方案。你已經有了。我只是將順序改爲1,3,4,2 - 這樣它也可以在'(owner,position)'上使用唯一鍵。 –
@PaulSpiegel在重新訂購工作中有一些麻煩(直接交換會留下空白,並且讓我的頭部繞過倉位很棘手),但好主意在於:在數據庫級別執行它。 – JakeSteam