急用:反复读存数据库

liuquanyi 2004-09-22 10:05:38
小弟要对mysql数据库中的表A(字段1、2、3、5)和表B(字段2、4)的数据连接查询到字段1、2、3、4,然后把得到的的每个结果,按字段1、2、4按次序的写进表C( 1、2、4),这时表C的id(int(10) auto_crement)字段已经自动排列,在写入表C同时又写在表A中:update A set A.5=C.id where C.1=A.1写到A中。
如此复杂的操作,看来编程,不知道如何实现:能用java最好?

小弟第一次遇到如此频繁的读取数据库,不知道jdbc的连接会出现什么样的错误?
这是在 调用prepareStatment(),executXXX后又调用此函数,又调用executeXXX,请问前辈如何顺利实现?
...全文
175 点赞 收藏 17
写回复
17 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
liuquanyi 2004-09-27
问题解决了,我们在调整数据库的时候一定要相信党,相信sql语言,他是一定能帮助我们战胜困难,走向光明的!
最后感谢所有热心的人,尤其感谢newste(旭林) 大哥,从他的回帖数就能看到,他的帖子多而富有质量,人热情而富有智慧,得人如此指点,夫复何憾!
解决方法:
1、对A加个字段4(alter table add 4 ),同时按照加进4的值。(有个条件忘说了,A的值包含所有B的值)。
2、然后采用内连接插入和更新即可!
此次主要是初次遇到如此复杂的数据库操作,在加上大数据量,所以有些慌!

最后再次表示感谢!
回复
newste 2004-09-26
你要是想看到结果你就用个线程每次处理1000条结束后告诉你结果,
编成不要老撞牛角尖,换个想法在做下,

回复
newste 2004-09-26
我怀疑是你数据连结问题,我上次一次向数据库插入50万多条只花了1分多钟,我机器和你一样,你不要反复的开关数据库保持这连结看看,会不会快点
回复
newste 2004-09-26
你要快点就用scoket把
回复
disizhishou 2004-09-24
楼主这么多数据怎么能一次读呢,分多次读嘛,可以select 1,2,3,4 from A limit 1000 order by 1了,具体方法改改newste(旭林)的代码 就足够了,大数据量操作的时候不要用打印println输出进展,难道你不知道99%的时间耗在i/o上面了吗?
回复
liuquanyi 2004-09-24
后来还出现说虚拟内存不够!(cpu赛扬2.4G,内存:256M)
那我为了完成,难道要配置一个新电脑!
:(
回复
liuquanyi 2004-09-24
mysql-front其实就是一个GUI的mysql的sql执行工具,象查询分析器一样的东东!
我现在很绝望,大数据量的读取难道无法实现吗?
我其实是把Access的表读进mysql,然后才进行的表操作,因为我相信mysql.
可是:
1、我用odbc把Access的表读进mysql,access有70万条记录,现在发现竟然mysql的表只导了12万条记录。
2、我后来在mysql来直接执行语句:insert into c (1,2,4) select a.1, a.2, b.4 from a, b where a.2=b.2;(littlegang(Gang) 的提醒),然后电脑的不动(竟然mysql连这都执行不了!强郁闷!!!)
3、编程好一些,因为打印可以看到执行到哪里了,可是也太慢了,半个小时竟然直有2万条封装到ArrayList里。

我有些绝望!
回复
liuquanyi 2004-09-23
感谢newste(旭林) ,真的很感谢呀!

只是有个问题:
本人习惯:在写SQL语言的时候我总是在mysql-front里测试一下语法,
这次因为表B有一万多条,所以运行sql语句:
"select A.1,A.2,A.3,B.4 from A,B where A.2=B.2"
的时候总是电脑停止,不知道把如此多的结果封装在ArrayList info里java虚拟机能完成吗?
回复
newste 2004-09-23
像你这样的东西最好放到晚上下班了让服务器自动取执行
回复
newste 2004-09-23
mysql-front我没有用过不知道该怎么帮你
回复
newste 2004-09-23
我看是你内存太小了,你要相信jvm要不你就不要用它了.要不你做个进度条把,用个线程来做
回复
littlegang 2004-09-23
insert into c (1,2,4)
select a.1, a.2, b.4 from a, b where a.2=b.2;


update a set a.5 = c.id
from c where a.1=c.1

sql92 support doing so, but i am not sure whether it can work in mysql
回复
liuquanyi 2004-09-23
没想到是如此多的数据,有10万以上吧,作了打印后运行java程序,屏幕慢吞吞的一个一个的显示,
"
第10009条存进ArrayLIst info
第10010条存进ArrayLIst info
第10011条存进ArrayLIst info
……
"
看来要死机了,不知道有没有能解决的?
回复
newste 2004-09-22
public int readwriteSQL(){
int iReturn=0;
ArrayList info=new ArrayList();
Statement st=null;
ResultSet rs=null;
int iId=0;
st=DataBase.getConnect();
if(st!=null){
try{
//读出你所要的数据添加到数组info中;
String sSql="select a.1 as 1,a.2 as 2,a.3 as 3,a.5 as 5,b.4 as 4 from A inner join B on A.2=B.1";
rs=st.executeUpdate(sSq);
while(rs.next()){
String[] sTemp=new String[5];
sTemp[0]=rs.getStrnig("1");
sTemp[1]=rs.getString("2");
sTemp[2]=rs.getString("3");
sTemp[3]=rs.getString("4");
sTemp[4]=rs.getString("5");
info.add(sTemp);
}

//取得c中最后一个id;
sSql="select max(id) from c "
rs=st.executeUpdate(sSql);
if(rs.next()){
iId=rs.getInt(1);
}
//写入c 表,并更新A表
if(info.size()>0){
for(int i=0;i<=info.size();i++){
String[] sInfo=(String[])info.get(i);
iId=iId+i+1;
sSql="insert into c(1、2、4) values ('"+ sInfo[0] +"','"+ sInfo[1] +"','"+ sInfo[3] +"')";
iReurn=st.executeUpdate(sSql);
if(iReturn==1){
sSql="update a set 5='"+ iId +"' where a.1='"+ sInfo[0] +"'";
st.executeUpdate(sSql);
}
else{
System.out.pritnln("Update A is lost id:"+iId);
}
}
}

}
catch(SQLException se){
System.out.println("readwriteSQL:"+se.toString());
iReturn=-1;
}
}
finally{
try{
Connection con=st.getConnection();
st.close();
con.close();
}
catch(SQLException se){
System.out.pritnln("closeDatabse:"+se.toString());
iReturn=-2;
}
}
return iReturn;
}
不知道你要的是不是这样
回复
newste 2004-09-22
这有什么难的,我做过比这难得多的都有,
你既然已经能用连接查询可以把数据读出来了那你可以把这些数据放到一个数组中,你要操作的无非是对数组按照你的要求进行排序,你可以先判断第一个int i=executeUpdae(sSql1)是不是=1,如果如果在执行第二个sSql2不就可以了
回复
Frank1982 2004-09-22
你后面一个问题没有看懂的说
回复
Frank1982 2004-09-22
把取出的东西放在一个数组中,然后对数组进行排列,然后再循环调用update的sql语句将数组中的数据存到数据库中就可以了啊
回复
相关推荐
发帖
Web 开发
创建于2007-09-28

8.0w+

社区成员

Java Web 开发
申请成为版主
帖子事件
创建了帖子
2004-09-22 10:05
社区公告
暂无公告