[MySQL]在一个update语句中对不同的行更新不同的数据

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语句里被赋值到对应的行上,功能就完成啦。



本文发布于 https://luojia.me

本站文章未经文下加注授权不得拷贝发布。

0 0 投票数
打分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论