Mysql更新,其中每个更新行的数量都在增加
是否可以运行MySql查询来更新某些行,但为每行中更新的值提供一个递增的值 为此,我研究了存储过程,但无法创建这样的过程 以下是一个示例,帮助您更好地了解我想要实现的目标: 桌子Mysql更新,其中每个更新行的数量都在增加,mysql,stored-procedures,Mysql,Stored Procedures,是否可以运行MySql查询来更新某些行,但为每行中更新的值提供一个递增的值 为此,我研究了存储过程,但无法创建这样的过程 以下是一个示例,帮助您更好地了解我想要实现的目标: 桌子 id text myCustomValue myMatchValue 1 Test1 1 a 2 Test2 2 a 3 Test3 3
id text myCustomValue myMatchValue
1 Test1 1 a
2 Test2 2 a
3 Test3 3 a
4 Test4 1 b
5 Test5 1 c
6 Test6 2 b
7 Test7 3 b
我的自定义查询基本上应该实现以下功能:
UPDATE table SET myCustomValue = increasingNumberStartingAt_5 WHERE myMatchValue = a;
通过此查询,结果将是:
id text myCustomValue myMatchValue
1 Test1 5 a
2 Test2 6 a
3 Test3 7 a
4 Test4 1 b
5 Test5 1 c
6 Test6 2 b
7 Test7 3 b
我需要这样做,因为表很大,因此我无法对数据库运行许多查询来分别更新每一行。我可以一次发送多条语句,但似乎应该有一个更简单的解决方案,我想不出来。试试这个:
UPDATE mytable AS t1
INNER JOIN (
SELECT id, @rn := @rn + 1 AS rn
FROM mytable
CROSS JOIN (SELECT @rn := 4) AS var
WHERE myMatchValue = 'a'
ORDER BY id
) AS t2 ON t1.id = t2.id
SET t1.myCustomValue = t2.rn
上面的UPDATE
语句对使用变量的派生表使用内部联接
,以枚举表的匹配记录。第一条匹配记录的值为5,下一条记录的值为6,以此类推
试试这个:
UPDATE mytable AS t1
INNER JOIN (
SELECT id, @rn := @rn + 1 AS rn
FROM mytable
CROSS JOIN (SELECT @rn := 4) AS var
WHERE myMatchValue = 'a'
ORDER BY id
) AS t2 ON t1.id = t2.id
SET t1.myCustomValue = t2.rn
上面的UPDATE
语句对使用变量的派生表使用内部联接
,以枚举表的匹配记录。第一条匹配记录的值为5,下一条记录的值为6,以此类推
你可以这样做
UPDATE mytable e,
(SELECT @n := 4) m
SET e.myCustomValue = @n := @n + 1
WHERE e.myMatchValue ='a'
你可以这样做
UPDATE mytable e,
(SELECT @n := 4) m
SET e.myCustomValue = @n := @n + 1
WHERE e.myMatchValue ='a'
您可以尝试以下方法:
SET @start_at = 4; -- 1 minus your desired start point
UPDATE
my_table a
INNER JOIN (
SELECT
id, @start_at := @start_at + 1 AS _row
FROM
my_table
WHERE
myMatchValue = 'a' ) b
ON
a.id = b.id
SET
a.myCustomValue = b._row;
此处:您可以尝试以下方法:
SET @start_at = 4; -- 1 minus your desired start point
UPDATE
my_table a
INNER JOIN (
SELECT
id, @start_at := @start_at + 1 AS _row
FROM
my_table
WHERE
myMatchValue = 'a' ) b
ON
a.id = b.id
SET
a.myCustomValue = b._row;
此处:您的查询有什么问题?只需将其更改为:set myCustomValue=myCustomValue+4,其中myMatchValue='a'@Yossi它不是一个真正的查询。它只是用来解释我想要达到的目标。看看结果。它用不同的值更新了3行。是的,但正如你所看到的,它们都是+4,然后是原来的值!那么,你的示例查询有什么问题吗?@Yossi哦,对了。我应该解释得更清楚些。myMatchValue可以更改。在这样的更改之后,我将有重复的MyCustomValue,基本上应该从某个值开始重新编制索引。您的查询有什么问题?只需将其更改为:set myCustomValue=myCustomValue+4,其中myMatchValue='a'@Yossi它不是一个真正的查询。它只是用来解释我想要达到的目标。看看结果。它用不同的值更新了3行。是的,但正如你所看到的,它们都是+4,然后是原来的值!那么,你的示例查询有什么问题吗?@Yossi哦,对了。我应该解释得更清楚些。myMatchValue可以更改。在这样的更改之后,我将有重复的myCustomValue,基本上应该从某个值开始重新编制索引。这非常简单。@MichaelFrey这不会根据
id
以升序更新myCustomValue
。如果这不是一个要求,那么这就是您的查询。@Giorgosbetos感谢您的解释。顺序在我的情况下并不重要,所以我选择了这个答案。它的简单性令人惊讶。@MichaelFrey它不会根据id
以升序更新myCustomValue
。如果这不是一个要求,那么这就是您的查询。@Giorgosbetos感谢您的解释。在我的案例中,顺序并不重要,所以我选择了这个答案。