免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2455 | 回复: 8
打印 上一主题 下一主题

实现批量插入的一个问题。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-18 12:04 |只看该作者 |倒序浏览
希望在一张表中批量插入, 输入为tab分隔的txt文件。
困惑:
1. 如果使用load data,感觉对于每行的错误处理无法控制,另外如果某一行插入失败,
    希望前面成功插入的行能取消,就是rollback。 mysql文档中有关load data的描述
    没有有关错误处理的描述,似乎是达不到这个要求的。
2. 使用sql脚本,逐行检查并插入,但是sql对于处理外部文件能力好像很差,无法逐行
    读入。显示提示信息、记录log,都很不方便。
3. 使用bash脚本,再调用mysql,但是这样每次调用mysql都是不同的session,没办法
    rollback。
怎么办呢?

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
2 [报告]
发表于 2009-07-18 12:53 |只看该作者
你的表是啥engine的?
如果是innodb的话,先awk把txt转成批量的insert,再把所有insert放在transaction里。当中有错就会回滚了

论坛徽章:
0
3 [报告]
发表于 2009-07-18 13:18 |只看该作者
这个还和引擎有关?
我初学mysql,很多东西还未求甚解。
用awk的意思是不是用bash脚本自动生成一个sql脚本,然后用sql脚本插入?
这倒可以一试。
不过这种方法就是bash脚本不能根据单条insert语句的成功与否来做些外部处理。

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
4 [报告]
发表于 2009-07-18 13:46 |只看该作者
myisam不支持事务所以不能回滚。
innodb支持,所以你把所有的插入放到一个事务里,如果有一步不能完成,就会回滚之前的操作。

“不过这种方法就是bash脚本不能根据单条insert语句的成功与否来做些外部处理。”
你想做什么样的外部处理?

论坛徽章:
0
5 [报告]
发表于 2009-07-18 22:57 |只看该作者
贴一下什么样的数据,想完成什么。
你的描述,我也没搞懂。

论坛徽章:
0
6 [报告]
发表于 2009-07-21 18:02 |只看该作者
不好意思提了问这两天没顾得上来。
我只是在做练习,不是在项目中实用。
我是想用脚本实现这种操作:
1. 从txt逐行读取数据项插入已建好的一张表。
2. 如果当前行没有问题,插入成功,则给出个提示,接着插入下一行。
3. 如果当前行出问题,则显示出错信息,并rollback。
这样根据输出信息更改txt文件(手工),然后在运行脚本。

其实我想到更好的流程是先不插入,直接逐行检查数据有效性,
给出一份报告,没错后在做数据插入。但是我没有想到检查数据的
好方法,如果insert有dry run的功能就好了,有没有办法实现呢?

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
7 [报告]
发表于 2009-07-22 13:04 |只看该作者
如果你所说的错误是插入数据本身的错误,而不是与先前数据冲突的错误的话。
可以用temporary表,所有数据都成功插入后,在把这个表copy过去。
mysql本身没有这样的功能,所以如果要完成一个完全符合要求的插入过程的话,还是需要自己写脚本。用perl会比较简单。

论坛徽章:
0
8 [报告]
发表于 2009-07-22 16:27 |只看该作者
我觉得数据有效性的检查就是完整性测试。
如果用外部脚本检查,那么检查规则可能和sql内部定义的完整性不一致。
所以最好用sql内部检查功能。不过sql好像没有这个功能,除非你去insert他才回去做检查。
问题抽象一下,其实就是如果实现insert的dry-run功能了。
如果把单条insert放到事务里面,后面无条件回滚,不知可否,试试。

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
9 [报告]
发表于 2009-07-22 18:33 |只看该作者
所以我的意思是用外部脚本通过mysql的连接(例如perl-dbd)对临时表进行插入,然后从返回值判断是否有错。
如果全部执行完都没错,那么就把临时表插入到业务表里去。
如果有错,就print错误问题。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP