Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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 - Fatal编程技术网

MySQL针对“的正确语句”;更新列中的所有行>;数字;?

MySQL针对“的正确语句”;更新列中的所有行>;数字;?,mysql,Mysql,我有一个名为“images”的表,其中有几行图像名称和它们的位置值(它们在站点上出现的顺序) 我试图做的是减少所有位置列值,如果它们高于一个特定的值 例如,如果要删除“cat”,我想查找位置较高的所有行(可能是snake和dog),并将它们的位置值减1。我需要一个SQL语句 “更新“位置”>“值”所在的所有“位置”列” 我知道我需要获取要删除的图像的“位置”,并在更新具有较高位置列的其余行之前将其设置为“值”。但是,我不确定如何为以下内容创建SQL语句: “更新“位置”>“值”所在的所有“位置”

我有一个名为“images”的表,其中有几行图像名称和它们的位置值(它们在站点上出现的顺序)

我试图做的是减少所有位置列值,如果它们高于一个特定的值

例如,如果要删除“cat”,我想查找位置较高的所有行(可能是snake和dog),并将它们的位置值减1。我需要一个SQL语句

“更新“位置”>“值”所在的所有“位置”列”

我知道我需要获取要删除的图像的“位置”,并在更新具有较高位置列的其余行之前将其设置为“值”。但是,我不确定如何为以下内容创建SQL语句:

“更新“位置”>“值”所在的所有“位置”列”


我不确定是否需要一个或两个查询。

您可以使用以下简单的
更新:

UPDATE images SET position = position - 1 WHERE position > 1
您还可以使用以下命令来更新图像和删除特定图像:

-- first update the other images
UPDATE images t1, (SELECT * FROM images WHERE id = 2) t2 SET t1.position = t1.position - 1 WHERE t1.position > t2.position

-- now you can delete the image
DELETE FROM images WHERE id = 2

受此启发,您可以在删除一个或多个图像后使用以下
更新
来缩小间隙。在这种情况下,您必须使用MySQL 8.0或更高版本(用于):

在这种情况下,您还可以删除多个图像,如下所示:

DELETE FROM images WHERE id IN (1, 2)

您可以使用以下简单的
更新:

UPDATE images SET position = position - 1 WHERE position > 1
您还可以使用以下命令来更新图像和删除特定图像:

-- first update the other images
UPDATE images t1, (SELECT * FROM images WHERE id = 2) t2 SET t1.position = t1.position - 1 WHERE t1.position > t2.position

-- now you can delete the image
DELETE FROM images WHERE id = 2

受此启发,您可以在删除一个或多个图像后使用以下
更新
来缩小间隙。在这种情况下,您必须使用MySQL 8.0或更高版本(用于):

在这种情况下,您还可以删除多个图像,如下所示:

DELETE FROM images WHERE id IN (1, 2)

实际上,我建议不要在删除记录后进行更新。相反,只需使用
行号
生成每条记录的有效位置,例如

SELECT
    id,
    name,
    ROW_NUMBER() OVER (ORDER BY position) position
FROM yourTable;
删除行不会更改表中所有记录之间的相对顺序


如果您没有使用MySQL 8+,那么您可以很容易地使用用户变量模拟行数。

我建议您不要在删除记录后进行更新。相反,只需使用
行号
生成每条记录的有效位置,例如

SELECT
    id,
    name,
    ROW_NUMBER() OVER (ORDER BY position) position
FROM yourTable;
删除行不会更改表中所有记录之间的相对顺序


如果您没有使用MySQL 8+,那么您可以很容易地使用用户变量模拟行数。

我会使用触发器:

DELIMITER //

CREATE TRIGGER position_after_delete
AFTER DELETE
   ON images FOR EACH ROW

BEGIN

   -- Update position 
   UPDATE images SET position = position - 1 WHERE position > OLD.position

END; //

DELIMITER ;

我会使用触发器:

DELIMITER //

CREATE TRIGGER position_after_delete
AFTER DELETE
   ON images FOR EACH ROW

BEGIN

   -- Update position 
   UPDATE images SET position = position - 1 WHERE position > OLD.position

END; //

DELIMITER ;