3

我有一个这样的 mySql 表(简化)

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

现在,在我删除一行之后,我想更新剩余行的 Pos 值,这样就不会发现“洞”或间隙。

例如,如果删除了 Id='C' 的行,则剩余表应为:

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

您可以通过在表上创建一个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;
于 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 回答