MySql,删除后更新计数器以不包含任何间隙
我有一个类似这样的mySql表(简化) 现在,在我删除一行之后,我想更新其余行上的Pos值,这样就不会找到“孔”或间隙 例如,如果删除了Id为='C'的I行,则重新生成的表应为:MySql,删除后更新计数器以不包含任何间隙,mysql,sql-update,delete-row,Mysql,Sql Update,Delete Row,我有一个类似这样的mySql表(简化) 现在,在我删除一行之后,我想更新其余行上的Pos值,这样就不会找到“孔”或间隙 例如,如果删除了Id为='C'的I行,则重新生成的表应为: Id*| Text | Pos (integer) ----------- A | foo | 0 B | bar | 1 D | qux | 2 这在单个查询中是否可能 更新 根据公认的答案,这是我问题的解决方案: START TRANSACTION; SELECT @A:=pos FROM t
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;
您可以通过在表上创建 或通过使用交易:
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;
我认为这应该有效,(我还没有测试过)
您可以在任何删除后运行此语句
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
谢谢,这很接近我想要的。只是在我的情况下不工作,因为ID没有排序(它是一个随机字符串),不客气!您只需在
更新
查询中添加按id排序的ASC
。请尝试更新的答案。但是,当您使用“id>'C'”且id未排序时,它仍不起作用。确定。发生这种情况的原因可能是VARCHAR
字段id
的数据类型。请尝试更新的查询。非常感谢你/你为我指路。您的答案无效,引发了一个错误:无法在FROM子句中为update指定目标表“table_name”。根据你的回答,我已经用一个可行的解决方案更新了我的问题。再次感谢
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