Mysql更新,其中每个更新行的数量都在增加

Mysql更新,其中每个更新行的数量都在增加,mysql,stored-procedures,Mysql,Stored Procedures,是否可以运行MySql查询来更新某些行,但为每行中更新的值提供一个递增的值 为此,我研究了存储过程,但无法创建这样的过程 以下是一个示例,帮助您更好地了解我想要实现的目标: 桌子 id text myCustomValue myMatchValue 1 Test1 1 a 2 Test2 2 a 3 Test3 3

是否可以运行MySql查询来更新某些行,但为每行中更新的值提供一个递增的值

为此,我研究了存储过程,但无法创建这样的过程

以下是一个示例,帮助您更好地了解我想要实现的目标:

桌子

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感谢您的解释。在我的案例中,顺序并不重要,所以我选择了这个答案。