合并两个数据库a,b, 从a得item表取出数据,做少量修改,然后插入b得item表,
a得item有200万条数据,b得item有300万条数据,在插入第二条数据时update处报错。代码如下 BOOL CHFLogical::Process_Item(long nStartRecord,long nEndRecord, _RecordsetPtr destrs)
{
long nMaxItemID=GetTableMaxID("sk_item","id",m_DestGameConn);
CString sqlselect;
sqlselect.Format("select * from sk_item limit %d,%d",nStartRecord,nStartRecord+nEndRecord);
_RecordsetPtr rs;
rs.CreateInstance(__uuidof(Recordset)); _variant_t varval; static long nRecordNum=0; long oldid=0,newid=0,newplayerid=0; long PlayerID=0; long OwnerID=0; long wps1=0,wps2=0,wps3=0,wps4=0; long nTotalCount= GetTableCount("sk_item","id",m_SrcGameConn);
try
{
rs->Open(_bstr_t(sqlselect),m_SrcGameConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); while (!rs->adoEOF) { m_pUI->SetProgressText("sk_item",++nRecordNum,nTotalCount); PlayerID = rs->Fields->GetItem("player_id")->Value; newplayerid = m_MapUserID[PlayerID];
varval = rs->Fields->GetItem("id")->Value;
oldid = (long)varval;
newid = ++nMaxItemID;
//添加新的记录到目标表中
destrs->AddNew();
Sleep(100);
long colcnt = destrs->Fields->Count;
for(long i=0;i<colcnt;i++)
{
destrs->PutCollect(i,rs->Fields->GetItem(i)->Value);
} //设置ID,MasterName
destrs->PutCollect("id",_variant_t(newid)); OwnerID = rs->Fields->GetItem("owner_id")->Value;
if(OwnerID==PlayerID)
destrs->PutCollect("owner_id",_variant_t(newplayerid)); destrs->PutCollect("player_id",_variant_t(newplayerid));
destrs->Update();
//把新旧id插入到容器中
m_MapItemID[oldid]=newid; //移动到下一条记录
rs->MoveNext();
}
rs->Close();
}
catch (_com_error e) {
AfxMessageBox("Process_Item 出错");
AfxMessageBox(e.Description());
if(rs->GetState()&adStateOpen)
rs->Close();
return FALSE;
}
return true;
}
a得item有200万条数据,b得item有300万条数据,在插入第二条数据时update处报错。代码如下 BOOL CHFLogical::Process_Item(long nStartRecord,long nEndRecord, _RecordsetPtr destrs)
{
long nMaxItemID=GetTableMaxID("sk_item","id",m_DestGameConn);
CString sqlselect;
sqlselect.Format("select * from sk_item limit %d,%d",nStartRecord,nStartRecord+nEndRecord);
_RecordsetPtr rs;
rs.CreateInstance(__uuidof(Recordset)); _variant_t varval; static long nRecordNum=0; long oldid=0,newid=0,newplayerid=0; long PlayerID=0; long OwnerID=0; long wps1=0,wps2=0,wps3=0,wps4=0; long nTotalCount= GetTableCount("sk_item","id",m_SrcGameConn);
try
{
rs->Open(_bstr_t(sqlselect),m_SrcGameConn.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); while (!rs->adoEOF) { m_pUI->SetProgressText("sk_item",++nRecordNum,nTotalCount); PlayerID = rs->Fields->GetItem("player_id")->Value; newplayerid = m_MapUserID[PlayerID];
varval = rs->Fields->GetItem("id")->Value;
oldid = (long)varval;
newid = ++nMaxItemID;
//添加新的记录到目标表中
destrs->AddNew();
Sleep(100);
long colcnt = destrs->Fields->Count;
for(long i=0;i<colcnt;i++)
{
destrs->PutCollect(i,rs->Fields->GetItem(i)->Value);
} //设置ID,MasterName
destrs->PutCollect("id",_variant_t(newid)); OwnerID = rs->Fields->GetItem("owner_id")->Value;
if(OwnerID==PlayerID)
destrs->PutCollect("owner_id",_variant_t(newplayerid)); destrs->PutCollect("player_id",_variant_t(newplayerid));
destrs->Update();
//把新旧id插入到容器中
m_MapItemID[oldid]=newid; //移动到下一条记录
rs->MoveNext();
}
rs->Close();
}
catch (_com_error e) {
AfxMessageBox("Process_Item 出错");
AfxMessageBox(e.Description());
if(rs->GetState()&adStateOpen)
rs->Close();
return FALSE;
}
return true;
}
myisamchk检查一下
用repair table xxx修复试试
myisamchk sk_item.MYI
另外你的MYSQL的错误日志中有什么信息?
一种可能就是你的并发操作过多。