数据库表之间的数据导入


目录:

  ---- 实现方法(一):通过写个php脚本实现

  ---- 实现方法(二):通过数据库管理工具导入(如:NavicatForMySQL)

 


 

实现方法(一):

     通过写个php脚本实现

 

思路: 

     1: 首先连接成功:两台服务器的数据库。

        (可以把服务器的旧数据表导出到本地数据库,并且把新表也创建在本地。

         这样操作步骤就变为:把本地的旧表转移的本地的新表)

     2:select查询原数据库表的数据,insert插入到新表。

     3:先确认一下旧表中的多少条数据。数据过多,要分批量读取。因为数据多的话会超时。

     4:在分批读取的时候记录下最后一新读取的ID.下次读取的时候重写sql语句,条件为大于上一次的id

    

PHP代码最大执行时间: 

           缺省的最长执行时间是 30 秒   由 php.ini 中的 max_execution_time 变量指定

           所以,如果一次读取的数据条数过多,会导致超时。   

   解决办法:   

           方法a:最简单当然是修改 php.ini 中 max_execution_time 的数值,不过不是所有人都有

                  权修改 php.ini。  若修改了,记得操作完后再改回去。

           方法b:在 PHP 程序中加入 ini_set('max_execution_time', '时间'),进行设置。也可以设置为0,表示无时间限制。

                  此方法不会修改默认的最大执行时间,只会在本次任务中有效.

 

操作前简单进行一些测试: 

     1:若数据已经存在,主键重复不会覆盖 

 

     2:若为空,可以insert成功吗?

            chare类型可以insert成功,int类型不可以插入成功。

            若字段类型为int,insert‘’或 Null  均不可以插入,

            所以要判断插入int数据时,若为‘’或null,应赋值为:0

可能出现的问题

     1:转移后的数据条数变少了?

         可能是有些数据insert失败。

         例如:char类型的字段,当字符中含有英文状态的单引号、双引号时,会导致insert失败。

         //通过正则,把"替换为“ ,把'替换为‘ ,即把英文状态的转换为中文状态,

         $description =  preg_replace('/"/', '”', $description);
         $description =  preg_replace('/\'/', '‘', $description);

         因为英文引号会与sql语句中的混淆,导致数据insert操作不成功。

     2:    //查找非主键重复的插入失败的数据    即:查看哪条数据没有插入成功,进而找出失败的原因

            if(mysql_query($sql1) == FALSE) {

                 $er = mysql_error();

                 // 主键冲突错误:Duplicate entry '1' for key 'PRIMARY'1

                 if( preg_match('/key/',$er) == 0 ) {

                      echo '非主键冲突错误';

                      echo $sql1;

                 }

             }

 

 

简单例子:

 

<?php
header("Content-Type:text/html;charset=utf-8");
echo "数据库转移<br/>";

$con = mysql_connect("localhost","root","123");
mysql_select_db("demo", $con);
mysql_query('set names utf8',$con);

//每次读取1000条数据   (要修改php的执行最大时间)
//$sql = "select * from table limit 0,1000";      //第一次读取1~1000条数据
//$sql = "select * from table limit 1000,1000";   //第二次读取1001~2000条数据

$sql = "select * from table limit 2000,1000";     //第三次读取2001~3000条数据

$result = mysql_query($sql,$con);

while( $r_arr = mysql_fetch_array($result,MYSQL_ASSOC) ) {
    $id = $r_arr['id'];
    $brandid =  $r_arr['name'];
    $proclass = $r_arr['age'];
    $proname = $r_arr['sex'];
    $price = $r_arr['hobby'];
   

    //新表1: 向新表1插入数据   (字符类型的字段,要加‘’)    

    $sql1 = "insert into new_1 value('','','');

    mysql_query($sql1);

 

    //新表2: 向新表2插入数据   

    $sql1 = "insert into new_2 value('','','');

    mysql_query($sql2);

    echo $id.' ';
}
?>

 


 

 

实现方法(二):通过数据库管理工具导入(如:NavicatForMySQL)

  描述:把A表,导入到B表 (A表和B表的表结构可能有差别,比如:A表比B表多几个或者少几个字段)

  步骤1、选择A表-》右击-》导出表-》选择.mdb的格式-》选择需要导出的字段-》导出

  步骤2、选择B表-》右击-》导入向导-》选择导入类型:.mdb类型-》选择文件、选择表-》选择目标表或者新建表-》目标表的栏位与源表的栏位的配对-》选择导入模式-》导入

  

 


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号