2012-09-12 3 views
3

틈을 포함하지하기 위해 카운터를 업데이트 삭제 이제MySQL은, 이후 나는이 같은 MySQL의 테이블이

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

, 내가 행을 삭제 한 후, 나는 나머지 행의 순위 값을 업데이트 할을 (간체) "구멍"이나 틈새가 발견되지 않도록하십시오.

내가 아이디 = 'C'로 행 삭제되면 예를 들어,이 지속 할 테이블은 다음과 같아야합니다

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

이는 단일 쿼리에 수 있습니까? 허용 대답을 기반으로

UPDATE 이 내 문제에 대한 해결책이었다

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; 

답변

2

당신은 테이블에 AFTER DELETE TRIGGER를 작성하여이를 달성 할 수있는,

또는 사용 거래에 의한

:

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; 
+0

감사합니다. ID가 주문되지 않았기 때문에 제 경우에는 작동하지 않습니다 (임의의 문자열) – Muleskinner

+0

당신을 환영합니다! UPDATE 쿼리에'ORDER BY id ASC'를 추가하기 만하면됩니다. 업데이트 된 답변을 시도하십시오. – Omesh

+0

하지만 여전히 "id> 'C'"를 사용하고 ID가 정렬되지 않아 작동하지 않습니다. – Muleskinner

1

이것이 제대로 작동해야한다고 생각합니다. (테스트하지 않았습니다) 삭제 후에이 명령문을 실행할 수 있습니다.

update t set t.Pos=a.iterator 
from tablename t 
join(
    SELECT @i:[email protected]+1 AS iterator, t.id 
    FROM tablename t,(SELECT @i:=0) r)a 
on a.id=t.id 
관련 문제