2015-07-01 90 views
0

我有一个临时表(从旧系统转储,有一长串很多细节)与约8K记录,我需要分解它,使用一些逻辑和插入数据分成3个不同的表格。Mysql多表插入约8k记录

table_temp (id, name, address, email, phone, mobile, etc......) 
tbluser (id, username, password, roleid, status) 
tblstudent (id, userid, name, address, classid, sectionid, etc.....) 
tblstudentdetails(id, studentid, address, contact details....) 

因为我需要获取数据,请放入一些逻辑并为所有这些表创建单独的插入语句。我试图创建大型插入语句,如:

INSERT INTO `tbluser`(`instsessassocid`, `username`, `password`, `roleid`, `status`) VALUES 
('1','[email protected]','$2y10$gFscDWwWKR8Iven6R','3','1'), 
('1','SONAM[email protected]','$2y10$gFscDWwWKR8Iven6R','3','1'), 
('1','[email protected]','$2y10$gFscDWwWKR8Iven6R','3','1') 

而对于其他表一样(你的想法):

INSERT INTO `tblstudent`(`scholarnumber`,`firstname`, `middlename`,`lastname`) VALUES 
('10000','PRAGUN','','TANWAR'),('10001','SONAM','','-'), 
('10002','HITESH','','KUMAR'),('10003','KHUSHI','','MEHTA'), 
('10004','ADITYA','','VASYANI') 

创建4条大插入语句后,我将它们存储在一个数组并发送到我的插入功能,它推迟了自动提交,采取每个插入语句,一旦一切正常,提交并应返回插入ID等

我的应用程序似乎超时(目前设置为默认/ 30秒),当然这样一个小插入不应该超时,任何人都可以点弄清楚我做错了什么,或者我可以怎样改进。

这是我的插入功能:

function dbInsert($sql) { 
    if (is_array($sql) == 0) { 
     $sqlarray[] = $sql; 
     } else { 
      $sqlarray = $sql; 
     } 
     $sqlCount = count($sqlarray); //echoThis($sqlCount); die; 
     $con = dbConnect(); 
     $insertID = array(); 
     try { 
      // begin a transaction 
      $con->autocommit(FALSE); 
      /* commit transaction */ 

      foreach ($sqlarray as $value) { 

       if ($con->query($value)) { 
        $insertID[] = $con->insert_id; 
       } else { 
        trigger_error(mysqli_error($con)); 
       } 
      } 
      // if no error, commit. 
      if ((!mysqli_error($con)) || (!mysqli_commit($con)) && ($sqlCount === count($insertID))) { 
       $con->commit(); //mysqli_commit($con); 
      } else { 
       $con->rollback(); 
       trigger_error("Error in dbInsert: " . mysqli_error_list($con)); 
       $con->close(); 
      } 
     } catch (Exception $e) { 
      // if any error, catch the exception and rollback 
      $con->rollback(); 
      trigger_error("Error in dbInsert:" . $e); 
     } 
     /* close connection and return the result */ 
     $con->close(); 
     return $insertID; 
    } 

这只是一个测试,一旦整理我将需要进口相当多的记录,所以我希望能有“现成的脚本”,它需要我可以使用。

我知道加载infile或mysqlimport的方式,但我需要的逻辑,我真的认为我的脚本应该能够完成这项工作。请注意,我在我的本地主机上,没有其他配置机器发生任何事情。

谢谢!

+0

您是使用MyIsam表还是Innodb? Innodb支持交易,但进口速度很慢。如果要计算执行时间,可以尝试导入少量行,并在操作前后获取时间戳。一旦完成,计算脚本要花多长时间是个小问题。 – Osuwariboy

+0

@Osuwariboy,我正在使用innodb。是的,我可以将它分解成更小的脚本。但是,如果大约3k记录(这是一组插入成为什么)应该超时?我正在做的事情或者事情的方式有什么严重的错误吗?感谢堆! – Anx

回答

0

你在做什么似乎没有任何内在的错误。但是,从你告诉我的情况来看,数据已经在一个表格中排成一行。所以也许你可以让MySQL为你做逻辑而不是PHP。这就是我的意思是:

1),因为你需要你的第一个临时表,所以你有足够的接收信息,你想

2添加尽可能多的领域),下面是一个会让你拆分解决方案与给定的分隔符的字符串:

Split value from one field to two

你在这里做什么是这样

UPDATE myTable 
SET newField1 = SUBSTRING_INDEX(SUBSTRING_INDEX(membername, ' ', 1), ' ', -1), 
newField2 = SUBSTRING_INDEX(SUBSTRING_INDEX(membername, ' ', 1), ' ', -1), 
.... 

到底查询,你想要的是你的数据分成所有的各个领域,而不是一个大领域。

4)最后,你可以这样做:

INSERT INTO tbluser 
SELECT field1, field2, field3 FROM myTable 

一旦数据在其适当的表,你可以运行一系列更新的那会修复任何逻辑是必要的,使数据适合生产。我不知道这是否会比批量插入更快,但我认为这是值得一试的。

+0

谢谢。实际上,我需要拆分数据,从不同的表中获取新的ID(通过select语句),并相应地插入3表中。我注意到我可以插入大约456条记录,然后超时。我曾尝试将数据写入csv文件并执行mysqlimport。但是如果能够通过php + mysql来完成这个任务,我将需要导入相当多的数据。我很惊讶,它无法处理这个,但我不知道如何改善这一点。有趣的是,MS访问似乎做得快得多。尽管谢谢你的帮助! – Anx

+1

你知道,如果表格都是临时的,你可以将它们创建为MyIsam,然后做一个改变表格将它们转换为Innodb。而且,Innodb在表格有索引字段时会显着减慢速度。也许你可以尝试创建你的表并在数据加载完成后放置索引。 – Osuwariboy

+0

谢谢@Osuwariboy,我会尽力的。然而,现在,我每次限制了大约500个记录集;它看起来更长,但我能够根据需要导入所有数据。再次感谢! – Anx