SQL批量插入数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL批量插入数据相关的知识,希望对你有一定的参考价值。

我有一个表A,里面存了很多数据,主键是id;另一个表B,主键是A.id和另一个字段B.xx;
现在我想从A表中取id,批量插入到B表中,字段XX的值是常数值。
怎么写SQL语句呢?

一、针对批量插入数据,如果量不是太多,可以多条SQL语句运行就可以了,

类似下面的语句,当然可以使用excel 编辑后,复制到查询器中运行,

insert into table(a,b) values(\'1\',\'a\')

insert into table(a,b) values(\'2\',\'b\')

insert into table(a,b) values(\'3\',\'c\')


二、大量数批量插入,即数据表的移植,数据备份转换之类的,就需要工具,比如MSSQL的DTS工具,pb的数据通道 等等。这里介绍一下 DTS工具。

1、在SQL安装目录下开启导入和导出数据,即DTS。

2、选择一个批量的数据,可以是表,也可以是带分隔符的文件,或excel文档之类,如图中选择,导入的格式

3、选择导入的目标

4、选择导入方式

5.具体的导入规则

参考技术A 循环插入:

DECLARE @MyCounter INT
SET @MyCounter = 0 /*设置变量*/
WHILE (@MyCounter < 2) /*设置循环次数*/
BEGIN
WAITFOR DELAY '000:00:10' /*延迟时间10秒*/
INSERT INTO time_by_day
(time_id, the_date, the_year, month_of_year, quarter, day_of_month)
SELECT TOP 1 time_id + 1 AS time_id, the_date + 1 AS the_date, YEAR(the_date + 1)
AS the_year, MONTH(the_date + 1) AS month_of_year, fn QUARTER(the_date + 1)
AS quarter, DAY(the_date + 1) AS day_of_month
FROM time_by_day
ORDER BY time_id DESC
SET @MyCounter = @MyCounter + 1
END
参考技术B update就能实现 SQL语句本身就是循环,可以实现批量处理 参考技术C insert into B(id,XX)
select id,'常数值' from A本回答被提问者采纳
参考技术D Insert into B(id) select id from A

参考资料:http://www.cnblogs.com/freshman0216/archive/2008/08/15/1268316.html

在mapper映射文件中批量插入数据的sql语句该怎么写?以及怎样在sql语句中接收list集合参数?

在mapper映射文件中批量插入数据的sql语句该怎么写?

单条数据插入的好好的,为什么要突然变成批量插入的呢?

为什么需要批量插入数据呢?因为加入你现在有一个100次的循环,每次循环你都需要往数据库里面插入一条数据,那么这样你连接数据库的次数就太多了,这样是比较耗费资源的,所以我们能不能一次性的批量地往数据库中插入所有的数据呢?这样我们只连接一次数据库就行了,节省资源,也可以提高速度。

怎样写批量插入

动态代理接口中传递的参数是一个list集合,如下图:

mapper映射文件中的插入语句如下图:

上面插入多条数据的时候需要用到标签去遍历动态代理接口中传递来的list集合参数,separator的作用是设置分隔符,也就是每遍历完集合中的一个元素会写一个分隔符,最后的格式也就是下面的这样,如下:

insert into budget_execution
(...),
(...),
(...)

collection的值就是动态代理接口中传递的参数的名字,因为这里的动态代理接口中传递的参数名字是"list",所以这里的collection的值也是"list"。其中集合中的每个元素是通过item设置的值接收的,这里也就是说i就代表集合中的元素,open和close的作用是:对遍历结果加上前后缀,比如我们现在循环遍历集合结束了,最后的遍历结果就是insert into Xxx values
(…),(…),(…)
这样我们是不需要对遍历结果(…),(…),(…)加上前后缀的,因为它满足我们插入sql语句的格式,因为我们此时把open和close的值都设置成""空字符串就行了。
但是如果要是查询sql语句的时候,传递了一个list集合参数,那么我们在sql语句中该怎么遍历list集合中的元素呢?如下图:


上图中的collection的值是reportIds,这是因为查询的动态代理接口里面传递过来的list集合的参数名字是reportIds。这里通过separator设置的分隔符也是逗号,那么遍历完所有的集合元素之后的结果如下:
select distinct category_id
from budget_report_category
where report_id in
reportId1,reportId2,reportId3…
这样肯定是不行的,因为这样的话sql语句会出现错误,所以我们必须要在前后都加上一个小括号,而小括号就是通过open和close来的值来加的,open表示对循环结果的前面加上一个东西,close表示对循环结果的后面加上一个东西,这里的open="(",close=")",那么最终的sql语句的形式如下:
select distinct category_id
from budget_report_category
where report_id in
(reportId1,reportId2,reportId3…)
这样就满足sql语句的规范了。

以上是关于SQL批量插入数据的主要内容,如果未能解决你的问题,请参考以下文章

Oracle 批量插入数据怎么做

SQL批量插入数据

Oracle数据的批量插入

sql批量插入数据之存储过程

LoadRunner11之批量插入SQL数据~2

在mapper映射文件中批量插入数据的sql语句该怎么写?以及怎样在sql语句中接收list集合参数?