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