MYSQL、MySQL、MySql、mysql 批量更新SQL写法实践
原创
©著作权归作者所有:来自51CTO博客作者sxdtzhaoxinguo的原创作品,请联系作者获取转载授权,否则将追究法律责任
摘要:今天在上线应用的时候,遇到需要批量更新数据的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='组织业务类型';
二:组织类型表数据如下图:

二:需求是这样的,由于组织表里面的"加盟性质"是新加的字段,现在需要把组织类型为分公司,子公司的组织的加盟性质都设置为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类型了。