是否可以运行更新某些行的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
我需要这个,因为表很大,因此我不能对数据库运行很多查询来单独更新每一行。我可以一次发送多个语句,但似乎应该有一个更简单的解决方案,我根本想不到。
答案 0 :(得分:3)
你可以做这样的事情
UPDATE mytable e,
(SELECT @n := 4) m
SET e.myCustomValue = @n := @n + 1
WHERE e.myMatchValue ='a'
答案 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,等等。
答案 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;
答案 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