3

私はこのようなmySqlテーブルを持っています(簡略化)

Id*| Text |  Pos (integer)
-----------
A  | foo  |  0
B  | bar  |  1
C  | baz  |  2
D  | qux  |  3

ここで、行を削除した後、残りの行のPos値を更新して、「穴」やギャップが見つからないようにします。

たとえば、Id ='C'の行が削除された場合、remaingテーブルは次のようになります。

Id*| Text |  Pos (integer)
-----------
A  | foo  |  0
B  | bar  |  1
D  | qux  |  2

これは単一のクエリで可能ですか?

更新 受け入れられた答えに基づいて、これは私の問題の解決策でした:

START TRANSACTION;
SELECT @A:=pos FROM table_name WHERE Id= 'C';
DELETE FROM table_name WHERE Id = 'C';
UPDATE table_name SET Pos = Pos - 1 WHERE Pos > @A;
COMMIT;
4

2 に答える 2

2

これは、テーブルにAFTERDELETETRIGGERを作成することで実現できます。

またはトランザクションを使用して:

START TRANSACTION;

SELECT Pos 
INTO @var_pos
FROM table_name
WHERE id = 'C';

DELETE 
FROM table_name
WHERE id = 'C';

UPDATE table_name
SET Pos = Pos - 1
WHERE Pos > @var_pos;

COMMIT;
于 2012-09-12T10:38:02.523 に答える
1

これはうまくいくはずだと思います(私はテストしていません)削除後にこのステートメントを実行できます

update t set t.Pos=a.iterator
from tablename t 
join(
     SELECT @i:=@i+1 AS iterator, t.id
     FROM tablename t,(SELECT @i:=0) r)a
on a.id=t.id
于 2012-09-12T10:41:45.563 に答える