加班,求SQL插入数据过多怎么解决

沙伽more 2013-05-26 10:17:08
表A出团时间表:
ID time
1 2013-05-11
2 2013-05-12
3 2013-05-13
4 2013-05-14
..............
表B对应出团价格表
ID a_id price
1 1 500
1 1 200
1 1 100
1 1 350
1 2 100
1 2 150
1 3 300
1 3 200
1 3 400
--------------------------------------------------
数据库里面A表为出团时间表,B表为出团价格表 B表中a_id与A表中ID是主、外键对应的,意思是一个出团下面有对应的1到4的价格; 现在的问题是:A表在页面上操作时别个客户会一次性加入几个月的出团时间,就是一次相当于有几百条数据,然后B中就相当于是几百乘以4的数据,如果直接前台循环一条一条的进行数据这些就与数据库交互次数太多了,求高手支招!!
...全文
241 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2013-05-27
  • 打赏
  • 举报
回复
那就是你的表设计有问题,主键都无法获取,比如一个货品表,一个货号(也就是对应你表中的id)可以做主键,而货品名+其他某些字段(业务我不熟)也可以唯一标识一行数据,那么他们的组合也可以成为一个主键,你看看你表上还有没有可以作为主键的字段
沙伽more 2013-05-27
  • 打赏
  • 举报
回复
引用 13 楼 DBA_Huangzj 的回复:
[quote=引用 12 楼 wang136206441 的回复:] [quote=引用 10 楼 DBA_Huangzj 的回复:] 这就是使用自增序列做主键的缺点之一。你如果要这样获取的话,需要二次查询,也就是插入以后再查一次插入的内容,获取他们的ID。但是前提是你能标识这批数据,否则获取不了
像我这种数据情况,有没有什么好的方法解决呢。我昨天想了一天,就是不论我前个表怎么批量插入我都获取不了这些插入后的ID,这样我后面的那个表的数据就不能进行添加[/quote]那除了那个ID,还有没有其他列的组合可以唯一标识一行?假设一下,你是每天导入一次,那么应该会有一个导入时间,你导入之后只需要select 一下那个导入时间在当天之内的数据,然后就可以获取这批ID了[/quote]不行啊,这个功能是放给客户的,我们也不晓得他们一天什么时候开团,也不知道,一天要开几次,在这两个表的上面还有一个有关系的线路表
發糞塗牆 2013-05-27
  • 打赏
  • 举报
回复
引用 12 楼 wang136206441 的回复:
[quote=引用 10 楼 DBA_Huangzj 的回复:] 这就是使用自增序列做主键的缺点之一。你如果要这样获取的话,需要二次查询,也就是插入以后再查一次插入的内容,获取他们的ID。但是前提是你能标识这批数据,否则获取不了
像我这种数据情况,有没有什么好的方法解决呢。我昨天想了一天,就是不论我前个表怎么批量插入我都获取不了这些插入后的ID,这样我后面的那个表的数据就不能进行添加[/quote]那除了那个ID,还有没有其他列的组合可以唯一标识一行?假设一下,你是每天导入一次,那么应该会有一个导入时间,你导入之后只需要select 一下那个导入时间在当天之内的数据,然后就可以获取这批ID了
沙伽more 2013-05-27
  • 打赏
  • 举报
回复
引用 10 楼 DBA_Huangzj 的回复:
这就是使用自增序列做主键的缺点之一。你如果要这样获取的话,需要二次查询,也就是插入以后再查一次插入的内容,获取他们的ID。但是前提是你能标识这批数据,否则获取不了
像我这种数据情况,有没有什么好的方法解决呢。我昨天想了一天,就是不论我前个表怎么批量插入我都获取不了这些插入后的ID,这样我后面的那个表的数据就不能进行添加
唐诗三百首 2013-05-27
  • 打赏
  • 举报
回复
前端程序可以先把数据都写进临时表里,然后再一次插入到正式表中.
發糞塗牆 2013-05-27
  • 打赏
  • 举报
回复
引用 9 楼 wang136206441 的回复:
[quote=引用 8 楼 DBA_Huangzj 的回复:] SQLServer就算面对百万级别的插入都是可以的,问题是你插入的方式,如果一条一条插入,那么开销巨大,服务器负担很重,但是如果你前端就可以获取一个结果集缓存下来,然后一次性插入,那么效率会高很多倍,难点就是在你前端如何组合成一个结果集。至于插入,大把方式,比较查用的是bulk insert。
批量插入的方式我是找到了,可是现在问题是:我把前表批量插入多了后,怎么获取到前表批量进入的序列号,因为要在后表中用到呢[/quote]这就是使用自增序列做主键的缺点之一。你如果要这样获取的话,需要二次查询,也就是插入以后再查一次插入的内容,获取他们的ID。但是前提是你能标识这批数据,否则获取不了
沙伽more 2013-05-27
  • 打赏
  • 举报
回复
引用 8 楼 DBA_Huangzj 的回复:
SQLServer就算面对百万级别的插入都是可以的,问题是你插入的方式,如果一条一条插入,那么开销巨大,服务器负担很重,但是如果你前端就可以获取一个结果集缓存下来,然后一次性插入,那么效率会高很多倍,难点就是在你前端如何组合成一个结果集。至于插入,大把方式,比较查用的是bulk insert。
批量插入的方式我是找到了,可是现在问题是:我把前表批量插入多了后,怎么获取到前表批量进入的序列号,因为要在后表中用到呢
weilus 2013-05-26
  • 打赏
  • 举报
回复
大批量操作不是都用存储过程么
沙伽more 2013-05-26
  • 打赏
  • 举报
回复
怎么都没有人,帖子都沉了啊,各位大大们,都去耍了啊
發糞塗牆 2013-05-26
  • 打赏
  • 举报
回复
SQLServer就算面对百万级别的插入都是可以的,问题是你插入的方式,如果一条一条插入,那么开销巨大,服务器负担很重,但是如果你前端就可以获取一个结果集缓存下来,然后一次性插入,那么效率会高很多倍,难点就是在你前端如何组合成一个结果集。至于插入,大把方式,比较查用的是bulk insert。
LongRui888 2013-05-26
  • 打赏
  • 举报
回复
这个一般可以通过批量化导入实现的,先导入主表A的几百条数据,应该会很快,然后再导入辅表B的数据,就可以了
bapi 2013-05-26
  • 打赏
  • 举报
回复
循环是面向过程的模式,sql的优势在于集合操作,想办法在应用程序中转换一下呗,一般使用proc是最常见的方案,一来与数据库的交互次数少,二来扩展性比直接向数据库提交insert/delete要好得多。
沙伽more 2013-05-26
  • 打赏
  • 举报
回复
哥子些,不要打酱油,好不好....
valid25f 2013-05-26
  • 打赏
  • 举报
回复
少提交。。。。
关键我是洛哥 2013-05-26
  • 打赏
  • 举报
回复
java 的话可以循环读取后批量操作到数据库 减少IO操作

34,591

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧