これは私のテーブルです:
ID int (Primary Key)
Name
Order
行を上下に移動しようとしています。だから私は注文フィールドを更新したい。
UPDATE Technology
SET Order = Order + 1
WHERE ID = 2;
列名に問題があると思いますorder
。order
はキーワードなので、直接使用することはできません。この方法を試してください:
Update Technology set [Order]=[Order]+1 Where ID=2
これを試して:
update menu
set [order]=m2.[order]+1
from menu
join menu m2 on menu.[Order]= m2.[Order]-1
OK、2 つのアイテム間でスワップ操作を行いたいと仮定すると、SET 句のロジックを変更できます。
--table setup
CREATE TABLE #Technology
(
Id int,
[Order] int,
Name varchar(10)
)
INSERT INTO
#Technology
(
Id,
[Order],
Name
)
VALUES
(1, 1, 'Menu1'),
(2, 2, 'Menu2'),
(0, 0, 'Menu0'),
(3, 3, 'Menu3')
--proof of original order
SELECT
*
FROM
#Technology
UPDATE
#Technology
SET
[Order] =
(
SELECT
[Order]
FROM
#Technology T1
WHERE
Id IN (1, 2)
AND #Technology.Id <> T1.Id -- get the order of the *other* item in the pair
) -- this subquery works because we only have two ids do work with
WHERE
Id IN (1, 2)
--new order
SELECT
*
FROM
#Technology
UPDATE Technology SET [注文] = [注文] + 1 WHERE [注文] >= ( SELECT [注文] FROM テクノロジー WHERE ID = 2 )
これにより、重複した注文がないことが保証されます (重複した注文が存在しない場合)。
あなたのコメントから、2 つの注文を交換したいと思います。私はおそらくストアドプロシージャでこれを行うでしょう
CREATE PROC swapOrders @order1 int, @order2 int
AS BEGIN
IF NOT EXISTS (SELECT * FROM Technology WHERE order = @order1)
OR NOT EXISTS (SELECT * FROM Technology WHERE order = @order2)
RETURN --if either of the orders aren't valid don't do anything. You may want to log or raise an error here
ELSE
UPDATE Technology
SET order = CASE order WHEN @order1 THEN @order2 WHEN @order2 THEN @order1 ELSE order END
END
これは、順序が一意であると仮定しています