Смотрите эту запись в моем блоге о том, как сделать это, используя рекурсивные CTE
и один IDENTITY
:
Обновление:
Если проблема состоит в том, чтобы собрать оборудование для следующего шага, то вам, вероятно, лучше использовать абсолютное значение вместо относительного.
Запомните предыдущее значение шага в переменной (на самой странице или на стороне сервера) и просто обновите его новым значением переменной.
Вместо этого:
UPDATE mytable
SET step = step + 1
используйте это:
SET @nextstep = 2
UPDATE mytable
SET step = @nextstep
Вы также можете добавить автоинкрементное поле last_update
в столбец, чтобы убедиться, что вы обновляете столбец, который не обновлялся после загрузки вашей страницы:
SELECT last_update
INTO @lastupdate
FROM mytable
WHERE item_id = @id
UPDATE mytable
SET step = @nextstep
WHERE item_id = @id
AND last_update = @lastupdate
Обновление 2 :
Если вы используете связанный список состояний (т.е. вы не обновляете, а вставляете новые состояния), просто отметьте столбец IDENTITY
и вставьте ID
предыдущего состояния:
item_id step_id prev_step_id
1 10232 0
1 12123 10232
, сделайте step_id
и prev_step_id
уникальными и запросите так:
WITH q (item_id, step_id, step_no) AS
(
SELECT item_id, step_id, 1
FROM mytable
WHERE item_id = 1
AND prev_step_id = 0
UNION ALL
SELECT q.item_id, m.step_id, q.step_no + 1
FROM q
JOIN mytable m
ON m.item_id = q.item_id
m.prev_step_id = q.step_id
)
SELECT *
FROM q
Если два человека хотят вставить две записи, то ограничение UNIQUE
на prev_step_id
сработает, и последняя вставка завершится неудачей.