摘要:今天在上线应用的时候,遇到需要批量更新数据的SQL写法,之前都是写的单条记录,今天写个批量更新,老是失败,后来发现是语法错误,现在来记录下这个过程。

一:数据库表结构,这里涉及2个表,一个组织表ou_org、一个组织类型表ou_orgtype,它们的表结构分别如下所示:

组织表:ou_org:

CREATE TABLE `ou_org` (
`id` bigint(20) NOT NULL,
`code` varchar(200) COLLATE utf8_bin DEFAULT NULL,
`name` varchar(200) COLLATE utf8_bin DEFAULT NULL,
`describe` varchar(500) COLLATE utf8_bin DEFAULT NULL,
`creator` bigint(20) DEFAULT NULL,
`modifier` bigint(20) DEFAULT NULL,
`ts_insert` datetime DEFAULT NULL,
`ts_update` datetime DEFAULT NULL,
`dr` bit(1) DEFAULT NULL,
`orgtype_id` bigint(20) DEFAULT NULL,
`affiliation` varchar(50) COLLATE utf8_bin DEFAULT NULL COMMENT '加盟性质(A轮/B轮/C轮/城市灯塔/无)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

组织类型表:ou_orgtype:

CREATE TABLE `ou_orgtype` (
`id` bigint(20) NOT NULL,
`code` varchar(200) COLLATE utf8_bin NOT NULL COMMENT '编码',
`name` varchar(200) COLLATE utf8_bin DEFAULT NULL COMMENT '名称',
`describe` varchar(500) COLLATE utf8_bin DEFAULT NULL COMMENT '描述',
`creator` bigint(20) DEFAULT NULL,
`modifier` bigint(20) DEFAULT NULL,
`ts_insert` datetime DEFAULT NULL,
`ts_update` datetime DEFAULT NULL,
`dr` bit(1) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='组织业务类型';

二:组织类型表数据如下图:

MYSQL、MySQL、MySql、mysql 批量更新SQL写法实践_MySql批量更新


二:需求是这样的,由于组织表里面的"加盟性质"是新加的字段,现在需要把组织类型为分公司,子公司的组织的加盟性质都设置为NONE类型,也就是说,需要把组织类型为03,04的组织的加盟类型都设置为NONE类型,这里就需要通过SQL批量更新数据了,下面就是具体的SQL写法:

update ou_org o set o.affiliation = "NONE" 
where 1=1 and o.id in (
(
select oo.id from
(
select
o.id,o.orgtype_id
from ou_org o
left join ou_orgtype ot on o.orgtype_id = ot.id
where 1=1
and o.dr is not NULL
and ot.dr is not NULL
and ot.`code` in ('03','04')
) as oo
)
)
;

这样组织类型为03,04的组织的加盟类型就设置为NONE类型了。