見我的博客如何做到這一點使用遞歸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
如果兩個人想要插入兩條記錄,那麼prev_step_id
上的UNIQUE
約束將失敗,並且最後一個插入將失敗。
如果B3已經存在,該怎麼辦?錯誤,什麼都不做或插入B4?沒有這個,我們不能真正回答... – gbn 2009-06-15 17:59:16
什麼都不做。該應用程序的設計非常糟糕,現在它會插入B4。您可以繼續點擊提交,也可以提交併繼續移動設備。 – 2009-06-15 19:13:13