精华帖 (8) :: 良好帖 (2) :: 新手帖 (0) :: 隐藏帖 (8)
|
|
---|---|
作者 | 正文 |
发表时间:2008-09-10
insert ignore
查查这个 |
|
返回顶楼 | |
发表时间:2008-09-10
按你的说法,操作比较频繁,而且表里面内容是只增不删的,肯定还是在内存里面维持一个关键字的map或者list合适,每次插入前先用程序过滤一遍,把重复的记录去掉再批量插入。
这个做法内存占用不会很大的,作为要判断是否重复的内容,肯定是类似名字或uid之类的内容,你总不可能通过比较两个很大的字符串来判断是否记录重复吧,这样的话,每条记录也就占几个字节,100万的记录也就占几兆内存而已。 需要注意的是数据同步的问题,就是怎么保证内存和数据库里面的记录是一致的,如果你能保证导入excel的操作同时只能一个用户进行的话,那就没有问题了。 |
|
返回顶楼 | |
发表时间:2008-09-10
不用这么麻烦吧,把插入表的主键做下过滤就可以了,
insert into a select * from b where b.id not exists (select 'x' from b where a.id = b.id) |
|
返回顶楼 | |
发表时间:2008-09-10
cenwenchu 写道 update,命中为0,就insert
你还不如先delete,不管结果如何都可以insert。 种种迹象表明,delete比update快些 |
|
返回顶楼 | |
发表时间:2008-09-10
插入的值是主键吗?
|
|
返回顶楼 | |
发表时间:2008-09-10
bluemeteor 写道 异常不是这么用滴!
做好索引,select count(*)来判断才是正道 扯!! 楼主的情况下一定要进攻式编程, 假设不存在重复 直接插入,如果出异常表示存在重复 select count(*)方式 是防御编程不适合用在这种情况 当然还要考虑重复的比率,上面的方法适合重复比较少的情况 |
|
返回顶楼 | |
发表时间:2008-09-10
先建Union索引,再用 insert ignore into tbl_name VALUES (...);
自动忽略重复的数据 |
|
返回顶楼 | |
发表时间:2008-09-10
wolfbrood 写道 vvgg 写道 hocus 写道 bluemeteor 写道 异常不是这么用滴!
做好索引,select count(*)来判断才是正道 我也同意 异常不应该被用于流程和业务逻辑判断 重复数据也可以看作一种异常吧 感觉有重复数据的几率远小于正常的几率,所以产生异常的代价和每次查询相比应该算小的。 重复数据是一种业务逻辑,怎么是异常了。能用简单判断语句解决问题就绝不能用异常解决问题,这点道理都不明白吗?异常别滥用。 典型的教条主义 本本主义 有时候能解决问题比这些鸟理论更有实际意义 |
|
返回顶楼 | |
发表时间:2008-09-10
xly_971223 写道 bluemeteor 写道 异常不是这么用滴!
做好索引,select count(*)来判断才是正道 扯!! 楼主的情况下一定要进攻式编程, 假设不存在重复 直接插入,如果出异常表示存在重复 select count(*)方式 是防御编程不适合用在这种情况 当然还要考虑重复的比率,上面的方法适合重复比较少的情况 一般我都是用进攻式编程。 因为先select (*)和插入数据之间有时间间隔(如果你事务是串行, 当我没有说过), 可能会导致数据重复而抛出异常。 |
|
返回顶楼 | |
发表时间:2008-09-10
tommy402 写道 不用这么麻烦吧,把插入表的主键做下过滤就可以了,
insert into a select * from b where b.id not exists (select 'x' from b where a.id = b.id) 大哥,你这样子不是要用到临时表吗???? |
|
返回顶楼 | |