Mysql更新每个更新的行的数量越来越多

时间:2016-03-03 15:48:26

标签: mysql stored-procedures

是否可以运行更新某些行的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

我需要这个,因为表很大,因此我不能对数据库运行很多查询来单独更新每一行。我可以一次发送多个语句,但似乎应该有一个更简单的解决方案,我根本想不到。

4 个答案:

答案 0 :(得分:3)

你可以做这样的事情

UPDATE mytable e,
   (SELECT @n := 4) m
SET e.myCustomValue = @n := @n + 1 
WHERE e.myMatchValue ='a'

SQL-Fiddle

答案 1 :(得分:1)

试试这个:

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语句使用INNER JOIN到派生表,该表使用变量来枚举表的匹配记录。第一个匹配记录的值为5,下一个记录的值为6,等等。

Demo here

答案 2 :(得分:0)

   UPDATE YOUR_TABLE
    INNER JOIN (
        SELECT
            T1.ID,
            @a := @a + 1 AS incr
        FROM
            (SELECT @a := 4) sl,
            YOUR_TABLE T1
        INNER JOIN YOUR_TABLE T2 ON T1.ID = T2.ID
        WHERE
            T1.myMatchValue = 'a'
    ) filteredTable ON YOUR_TABLE.ID = filteredTable.ID
    SET YOUR_TABLE.myCustomValue = filteredTable.incr;

RUNNING SQL FIDDLE

答案 3 :(得分:0)

你可以试试这个:

    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;

此处:sqlfiddle