使用“一条”SQL语句完成批量插入和批量删除操作

Posted @一支烟的功夫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用“一条”SQL语句完成批量插入和批量删除操作相关的知识,希望对你有一定的参考价值。

使用一条SQL语句做批量插入和删除操作

最近在做内容管理系统的时候发现一个问题:多复选框复选框操作,当全选的时候是批量往数据库中的某表插入数据,反选的时候需要批量删除表中的多行数据,删除某一条,增加某一条…由此需要频繁的对表进行修改,要考虑的情况还比较多,经个人多方实践,研究出如下“偏方”:
1. 首先是构造SQL语句:

Insert into T_Operator(F_OperatorID,F_GoodID)
(
    Selected
)

delete from T_Operator where F_OperatorID = F_OperatorID and F_MatchID in (UnSelected)

2.参数说明:
Selected表示拼接的字符串:
select 6,0 union select 6,11 union select 6,12
F_OperatorID表示操作员的ID号:这里是6
UnSelected表示未选择的商品ID,格式: 0,1,2

完整的SQL语句:

Insert into T_Operator(F_OperatorID,F_GoodID)
(
    select 60  union   
    select 611 union 
    select 612
)

delete from T_Operator where F_OperatorID = 6 and F_GoodID in (012)

意思就是在T_Operator中为F_OperatorID = 6 这个操作员增加3个物品ID分别为0,11,12的管理,插入完成后为这个操作员删除物品ID分别为0,1,2的管理,这条SQL语句在同时又增加和删除的时候是没有问题的。

那么问题来了,实际可能出现的情况是,只减少这个操作员对某个商品的管理,那么只需要执行删除操作,还有可能出现只增加操作员对某个商品的管理,那么只需要执行插入操作。

所以解释一下SQL语句中的“0”:例如当只删除F_GoodID = 8的商品的时候,为了使变量Selected不为空(为空报错),先插入一条6,0 数据(Selected 为 select 6,0),然后再delete语句中UnSelected条件设置为0,8,这样就删除了F_GoodID为0和8的数据。达到了我们删除F_GoodID = 8的目的。SQL语句如下:

Insert into T_Operator(F_OperatorID,F_GoodID)
(
    select 60
)

delete from T_Operator where F_OperatorID = 6 and F_GoodID in (08)

3.“偏方”解释
为何先插入0,再删除0?理由是Selected作为变量在SQL语句中不能为空,所以即使在只有删除操作的时候,我们为了保证SQL语句不报错,就插入F_GoodID = 0 这条数据,然后再删掉它,实际中可以是0也可以是其他内容只要没有任何意义就行。

同理在只增加F_GoodID = 8的时候,我们也为delete语句中的UnSelected预置0,SQL语句如下:

Insert into T_Operator(F_OperatorID,F_GoodID)
(
    select 6,0 union
    select 6,8
)

delete from T_Operator where F_OperatorID = 6 and F_GoodID in (0)

执行完以上SQL,实际上只完成了插入F_GoodID=8的操作。

以上就是所谓的使用“一条”SQL语句完成批量插入和批量删除操作,欢迎大家留言批评指正!

以上是关于使用“一条”SQL语句完成批量插入和批量删除操作的主要内容,如果未能解决你的问题,请参考以下文章

SqlServer——批量操作(批量添加,删除)

sql server有批量插入和批量更新的sql语句吗

sqlserver关于用一个sql语句批量添加数据的问题

PreparedStatement批量(batch)插入数据

JavaWeb学习笔记之Mybatis实用sql语句汇总

JavaWeb学习笔记之Mybatis实用sql语句汇总