关于两个数据库中删除数据的问题

cz082390 2012-03-30 10:34:10
遇到了一个这样的问题,有两个数据库A,B。分别有两个表a,b。这连个表中一个字段tid相等,且唯一,但是tid不是主键。
当我向表a中插入500条数据的时候,b中相应的也插入了500条。在删除的时候我遇到了困难,当删除a表中的全部内容的时候,需要将b表中的对应tid值相等的数据全部删除。
我开始的想法是:在对a表删除全部数据之前,将他的tid全部查询出来,然后存在list中,将list中的数据传到b表操作中,使用delete...in(list中的数据)语句删除,但是当数据量大的时候 超出了list的行数,所以希望大家帮忙,给我点提示,怎么实现,最好是执行速度不要太慢。
...全文
162 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
昨日凡阳 2012-04-01
  • 打赏
  • 举报
回复
效能方面,最好还是将这些操作全部放在数据库级别处理,直接使用数据库触发器来实现。
lchina1314 2012-04-01
  • 打赏
  • 举报
回复
直接来个数据表的同步,根本不需要你去维护从表。
cz082390 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

先删除A库中a表的数据,删除的同时把删除的记录按规则放在StringBuffer中,然后再去B库删b表数据,delete ...in(StringBuffer中的数据),如果数据还是大,这样出问题的话就删除A的时候把记录放在文件里面去,再读文件删除B
[/Quote]
不过这也是个很好的想法,如果数据量很大,分批删除解决起来也很困难,但是读取文件中的数据的时候是不是也需要分批读取啊?
cz082390 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

先删除A库中a表的数据,删除的同时把删除的记录按规则放在StringBuffer中,然后再去B库删b表数据,delete ...in(StringBuffer中的数据),如果数据还是大,这样出问题的话就删除A的时候把记录放在文件里面去,再读文件删除B
[/Quote]
将记录存在文件中在读取出来 这个过程 和直接将记录分批存在List中删除 哪个性能更好些?
cz082390 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]

不知道我理解你的意思没。
你可以看下数据库的级联删除,这时你只要删A表的数据,数据库会自己帮你删除相关联的B表数据。
[/Quote]
不知道级联删除能不能适用于两个数据库中的表?因为a,b两个表分别属于A,B两个数据库的。
abc130314 2012-03-31
  • 打赏
  • 举报
回复
不知道我理解你的意思没。
你可以看下数据库的级联删除,这时你只要删A表的数据,数据库会自己帮你删除相关联的B表数据。
awusoft 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
用trigger吧多简单。

还有,是在java端删除还是sql客户端里直接删,
java端删除的话,直接写两条sql语句就可以了啊,

delete from a where tid in (XXXXXX);
delete from b where tid in (XXXXXX);
[/Quote]

人家是两个数库啊......写的触发器也夸数据库操作啊?
awusoft 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
用trigger吧多简单。

还有,是在java端删除还是sql客户端里直接删,
java端删除的话,直接写两条sql语句就可以了啊,

delete from a where tid in (XXXXXX);
delete from b where tid in (XXXXXX);
[/Quote]

人家是两个数库啊......写的触发器也夸数据库操作啊?
cz082390 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

用trigger吧多简单。

还有,是在java端删除还是sql客户端里直接删,
java端删除的话,直接写两条sql语句就可以了啊,

delete from a where tid in (XXXXXX);
delete from b where tid in (XXXXXX);
[/Quote]
在a表中删除使用的是清空,delete from a。是要将b表中tid值与a表中删除数据tid值相同的数据一同删除掉,避免下次向a表中插入数据时,b表中的tid值不唯一。
菖蒲老先生 2012-03-30
  • 打赏
  • 举报
回复
用trigger吧多简单。

还有,是在java端删除还是sql客户端里直接删,
java端删除的话,直接写两条sql语句就可以了啊,

delete from a where tid in (XXXXXX);
delete from b where tid in (XXXXXX);
cz082390 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

是因为in()里边的数据太多了,你可以分批来删除啊.比如说每100个删除一次.
[/Quote]
对执行速度会不会影响太大?除了这个思路之外有没有其他的思路?
awusoft 2012-03-30
  • 打赏
  • 举报
回复
是因为in()里边的数据太多了,你可以分批来删除啊.比如说每100个删除一次.
cz082390 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

你的list应该是存放的是tid,那这样的话,你就遍历list进行拼装sql语句,不断的增加in后面的数据

当然这个我是按照你的思路改进的。
[/Quote]
我就是这样做的,数据量小的时候可以实现,但是当我删除的数据多的时候,超出了list的范围,maximum number of expressions in a list is 1000这种错误。
良才2015 2012-03-30
  • 打赏
  • 举报
回复
你的list应该是存放的是tid,那这样的话,你就遍历list进行拼装sql语句,不断的增加in后面的数据

当然这个我是按照你的思路改进的。
Intboy 2012-03-30
  • 打赏
  • 举报
回复
先删除A库中a表的数据,删除的同时把删除的记录按规则放在StringBuffer中,然后再去B库删b表数据,delete ...in(StringBuffer中的数据),如果数据还是大,这样出问题的话就删除A的时候把记录放在文件里面去,再读文件删除B
cz082390 2012-03-30
  • 打赏
  • 举报
回复
最后还使用了分批删除,删除的效率还是可以,只不过觉得实现的时候有点繁琐,因为急着完成,先这样,要是谁有更好的方法,跟大家一起分享一下哈。。。。
imwy1029 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

如果是用JDBC直接删的话,我觉得可以先从 A表插入你所要删的数据,然后循环,在依次删除.删一条A的,接着删一条 B的.
[/Quote]
看错,没看请需求..^-^!!!
imwy1029 2012-03-30
  • 打赏
  • 举报
回复
如果是用JDBC直接删的话,我觉得可以先从 A表插入你所要删的数据,然后循环,在依次删除.删一条A的,接着删一条 B的.
Define_ling 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

引用 3 楼 的回复:

是因为in()里边的数据太多了,你可以分批来删除啊.比如说每100个删除一次.

对执行速度会不会影响太大?除了这个思路之外有没有其他的思路?
[/Quote]


在后台代码的时候先获得a里面的值放在数据库中
然后在根据list。size for循环删除
数据量大比in快

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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