实例描述:
假设 对于某人信息的采集来自于多个途径,有手机,网址,客户端,采集到的信息如下 , 其中,date_type相同代表是同一个人,date_from代表采集的数据来自不同的途径 ,假设后台数据系统管理员会做如下操作,
1.查询到所有有效数据,对同属同一个人员的信息的 操作类型改为 "已修改" ,
2. 改操作必须修改 该用户下的所有操作类型, 对于数据类型为1的客户,如果只修改了前面两条的操作数据类型 , 系统不能让更新,既要么前端全部操作 全部更新数据成功,要么全部失败
3. 存在的问题,同样date_type为1的用户数据有可能不在同一页中,那么肯定会存在漏更新操作类型的数据,那数据得校验出来,不能让非法数据更新
实例实现:
假设管理员已经把所有符合同一date_type的数据操作完成,那在后台中计算该date_type出现的次数 , 具体的该date_type在数据库中的具体数量交给 Sql来解决 , 在跟新的时候使用 exists 可以防止数据不正确时跟新报错,既保证了跟新正确的数据,返回有问题的数据 , 其中使用 having count(t.ID)=3 来校验管理员修改的数据数量是否和数据库存储的数量是否相等,如果不相等,则数据也不会跟新
/*批量更新*/
--批量更新前查出符合要求的数据
SELECT t.ID FROM date_operator t WHERE
t.date_TYPE ='1'
AND t.date_from IN ('网站','手机')
--更新语句
update date_operator t2 set t2.operator_type='更新'
where exists(
select 1 from date_operator t
WHERE 1=1
and t.date_TYPE ='1'
AND t.date_from IN ('网站','手机')
AND t.date_TYPE=t2.date_TYPE
having count(t.ID)=3
)
2. 在xml中的可以使用selectKey 和 Befor获取更新成功的数据
<update id="updateDate" parameterType="com.test.bean.date_operator">
<selectKey keyProperty='id' resultType='int' order='BEFORE'>
SELECT t.ID FROM date_operator t WHERE
t.date_TYPE =#{date_TYPE}
AND t.date_from =#{date_from}
</selectKey>
update date_operator t2 set t2.operator_type=#{operator_type}
where exists(
select 1 from date_operator t
WHERE 1=1
and t.date_TYPE =#{date_TYPE}
AND t.date_from =#{date_from}
AND t.date_TYPE=t2.date_TYPE
having count(t.ID)=#{count}
)
</update>
3. 建表语句以及插入数据
create table date_operator
(
ID VARCHAR2(8),
date_TYPE NUMBER(4),
date_from VARCHAR2(32),
operator_type VARCHAR2(32)
)
INSERT INTO date_operator VALUES ('1',1,'手机','新增');
INSERT INTO date_operator VALUES ('2',1,'网站','新增');
INSERT INTO date_operator VALUES ('3',1,'手机','新增');
INSERT INTO date_operator VALUES ('4',2,'客户端','新增');
INSERT INTO date_operator VALUES ('5',3,'手机','新增');
参考文章:https://blog.csdn.net/u012373815/article/details/73864866