mysql中update的基础用法是update 表 set 列1=?,列2=?,... where 筛选条件
,这样的语句一次只可以对符合条件的所有行更新相同的数据,但update语句还可以join其它的表,从别的表读取数据更新到对应的行上,这样就可以实现对不同的行更新不同的数据,如下:
update
表名 as t1
inner join 表2 as t2 #也可以left join 或 right join 或 join,这里的join和select里面那个join用法是一样的
on t1.id列名=t2.id列名
set
t1.列1 = t2.列1,
t1.列2 = t2.列2
虽然上面的方法能实现标题的要求,但总不能先把数据插入一个表再这样update吧,于是我想了一会儿,想到如果要提交多组数据肯定要把数据结构化,如果要提交结构化数据那肯定是要用json,mysql 的json函数里有一个`JSON_TABLE`函数可以用来把一个json转换成一个表类型,那么这个方法就好实现了,只要把上面的表2替换成用JSON_TABLE生成的表,就可以通过直接向mysql提供一个json来对不同的行更新不同的数据了,如下:
update
表名 as t1
inner join JSON_TABLE(
?,
'$[*]' COLUMNS ( #把json作为一个数组遍历,提取每个子数组作为数据源
id列名 BIGINT PATH '$[0]', #提取子数组第一个元素,取名为"id列名",类型是BIGINT,建议取名为目标表中的id列名,这样方便用using
列1 INT PATH '$[1]', #提取子数组第二个元素,取名为"列1",类型是INT
列2 VARCHAR PATH '$[2]' #提取子数组第三个元素,取名为"列2",类型是VARCHAR
)
) as t2 using(id列名) #这个using是前一个例子中on语法的一种简写,用法参考官方文档
set
t1.列1 = t2.列1,
t1.列2 = t2.列2;
在 ? 的位置填入一个json字符串或者prepare这个语句后提交一个json字符串,就可以啦。json字符串示例如下:
[
[1,20,"张三"],
[2,24,"李四"],
[3,18,"王五"],
[4,23,"赵六"],
[5,55,"小二"],
[6,60,"poi"]
]
这样每个子数组中的第一个项目被提取为”id列名”,第二个为”列1″,第三个为”列2″(都是在上面的sql里的JSON_TABLE里取的名字),对应的值在set语句里被赋值到对应的行上,功能就完成啦。