IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

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

    罗佳(博主)发表于 2023-05-04 16:07:11
    love 0

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



沪ICP备19023445号-2号
友情链接