Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql,删除后更新计数器以不包含任何间隙_Mysql_Sql Update_Delete Row - Fatal编程技术网

MySql,删除后更新计数器以不包含任何间隙

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

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

现在,在我删除一行之后,我想更新其余行上的Pos值,这样就不会找到“孔”或间隙

例如,如果删除了Id为='C'的I行,则重新生成的表应为:

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