3).例子:导入一个以逗号为分隔符的文件文件中行的记录格式是这样的:
f;^R>x6 "1", "ORD89876", "1 Dozen Roses", "19991226"
!rmR*F- 我们的任务是要把这个文件里面的数据导入到数据库Meet_A_Geek中的表格Orders中,我们使用这个命令:
tbJhc bin/mysqlimport –prl –fields-enclosed-by=" –fields-terminated-by=, Meet_A_Geek Orders.txt
f8uk5CB6 ; 这个命令可能看起来很不爽,不过当你熟悉了之后,这是非常简单的。
}B7w%s$_ 第一部分,bin/mysqlimport ,告诉操作系统你要运行的命令是mysql/bin目录下的mysqlimport,选项p是要求输入密码,这样就要求你在改动数据库之前输入密码,操作起来会更安全。我们用了r选项是因为我们想要把表中的唯一关键字与文件记录中有重复唯一关键字的记录替换成文件中的数据。我们表单中的数据不是最新的,需要用文件中的数据去更新,因而就用r这个选项,替代数据库中已经有的记录。l选项的作用是在我们插入数据的时候锁住表,这样就阻止了用户在我们更新表的时候对表进行查询或者更改的操作。
aHk4h1 h:b rKs --------------------------------------------------------------------------------
ns qDR{3 从 MySQL 导入导出大量数据的程序实现方法
#bmb&W AQ O8Gh0n 大家一定使用过 phpmyadmin 里面的数据库导入,导出功能,非常方便。但是在实际应用中,我发现如下几个问题:
?;sf+Ct 1、数据库超过一定尺寸,比如6M 这时使用导出一般没问题,可以正确的保存到本机硬盘上面,但是导入则不行!原因是:一般的 PHP.INI 里面设置临时文件/上传文件的大小限制为2M,而phpmyadmin使用了上传的方式,造成失败。
~b%\ZM 2、导出到硬盘的 .SQL 文件在导回时,经常出现由于某些单引号的问题引起失败,造成导入失败,只能用 mysql等应用程序导入了。
mo\Z4 我的数据库已经超过10M,所以必须解决这个问题。我的思路:
>pSa{~F]-0 导出: 用phpmyadmin 保存数据库/表格结构,用脚本读取数据库内容并保存到文件里面!
rL xE#}/ 导入: 用phpmyadmin 恢复数据库/表格结构,用脚本读取文件,然后保存到库里面!
[j83? LFtY f}-=Q
导出程序如下:调用方法为 ****.php?table=tablename 8F3Tj IU
这个简单的程序目前一次保存一个表格!!每行为一个字段的数据!! zdFWLc=
~]0 \s
b^{QiL)eB
if($table=="")exit(); .];2>e8
mysql_connect("localhost","name","password"); &?t{HM$Kp
mysql_select_db("database"); 1~1O>X
$result = mysql_query("select * from $table"); ,US6
if(mysql_num_rows($result) < = 0) exit(); I+E3Qi
echo "开始转换数据到文本... 4_1c <
"; p3 Qy-
$handle = fopen("$table.txt","w"); uL"+dptj*
$numfields = mysql_num_fields($result); Qm_"I)
fputs($handle,$numfields." "); ll~ , M"0
for($k=0;$k B %8K/iH
{ uBY\L [P+
$msg = mysql_fetch_row($result); zL8hmOhI
for($i=0;$i< $numfields;$i++) R^Nx7!
{ GKRZ%+
$msg[$i] = str_replace(" ","&&php2000mysqlreturn&&",$msg[$i]); '*Tx KK--i
$msg[$i] = str_replace(" " ,"&&php2000mysqlreturn&&",$msg[$i]); DG7B :0d?
fputs($handle,$msg[$i]." "); JW1Q
} ]vo+@,(B
fputs($handle,"------- php2000 dump data program V1.0 for MySQL -------- "); &s#DcSH H
} }n;I{-wH<"
fclose($handle); f47J<5
echo "ok"; o%z5=n bA
?> *cmW:l+r .
QPp*D5t@
导入的程序如下:用法同上面! y 9K%?Nl
if($table=="")exit(); )Bzux"U}
mysql_connect("localhost","name","password"); DQXc?*>fG
mysql_select_db("database"); DZ=6?/
$message = file("$table.txt"); *k sD!^
echo $numfields = chop($message[0]); U!Ii c
for($k=1;$k O}ee2xG
{ Pd|0=p
$value=""; al_X Q_3>
for ($i=$k;$i< ($k+$numfields-1);$i++) >XP?E@Ay%
{ rewe=0h
$tmp = str_replace("&&php2000mysqlreturn&&"," ",chop($message[$i])); O]8illS
$value .= "'".addslashes($tmp)."',"; *X VB
} @ T\Mo Qb
$tmp = str_replace("&&php2000mysqlreturn&&"," ",chop($message[$k+$numfields-1])); ky-]K*%\@=
$value .= "'".$tmp."'"; *]qtd H
$query = "insert into $table values (".$value.")"; Sr [$Lko
echo mysql_error(); bD'XeW.
mysql_query($query); :^nN
echo $k." "; oJJVS&8#
} 8pha0._5
echo "ok"; $/WeoCsX8
?>
使用方法和可能的问题!
DUZa98gjT 1、导入时 file()函数可能会有问题(我的10M的数据没出现问题),可以改为 fopen()然后没次读一行!!
;XLZY 2、导入,导出都需要用 ftp 操作,也就是导出后,用 ftp 把数据转到本机,导入时先用ftp转移数据到服务器!
YqGc>2 mysql数据库常用导出导入命令的几个用例
9 O9qH@ ================================
['\&q< 几个常用用例:
GW{.oCZv 1.导出整个数据库
XQpIS mysqldump -u 用户名 -p 数据库名 > 导出的文件名
_$uZ {tH mysqldump -u WCNC -p smgp_apps_WCNC > WCNC.sql
2.导出一个表 L2f=@9BQ
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名 4==">p9I~D
mysqldump -u WCNC -p smgp_apps_WCNC users> WCNC_users.sql lt'/NGtc
3.导出一个数据库结构 :~l9o
mysqldump -u WCNC -p -d --add-drop-table smgp_apps_WCNC >d:WCNC_db.sql )gCj.o#z6
~Pkx]C
-d 没有数据 --add-drop-table 在每个create语句之前增加一个drop table 44LFz28
;t]ptjllu5
4.导入数据库 .#nj@8aq
常用source 命令 3L&bzH 9lf
进入mysql数据库控制台, 9tmXY?7
如mysql -u root -p hBJLT&-d<
6To^uiQ,<
mysql>use 数据库 $ucPV#
~ e^ X
然后使用source命令,后面参数为脚本文件(如这里用到的.sql) UlW)Z1D
mysql>source d:WCNC_db.sqlMySQL数据导入导出方法与工具介绍之二 * W, ^rK
6elmQ>DH
批处理是一种非交互式运行mysql程序的方法,如同您在mysql中使用的命令一样,你仍然将使用这些命令。为了实现批处理,您重定向一个文件到 mysql程序中,首先我们需要一个文本文件,这个文本文件包含有与我们在mysql中输入的命令相同的文本。比如我们要插入一些数据,使用包含下面文本的文件(文件名为New_Data.sql,当然我们也可以取名为New_Data.txt及任何其他的合法名字,并不一定要以后缀sql结尾): Iv(A#n$n
+6CiXK4.u
_O,D ^l
USE Meet_A_Geek; c"&Jxn)
INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Block"); %a`&|,@y
INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Newton"); FeyJ:[|#%
INSERT INTO Customers (Customer_ID, Last_Name) VALUES(NULL, "Simmons"); w Jo
V@>rr/o[
注意上面的这些句子的语法都必须是正确的,并且每个句子以分号结束。上面的USE命令选择数据库,INSERT命令插入数据。 [xY $ :W
6|k~4ix
下面我们要把上面的文件导入到数据库中,导入之前要确认数据库已经在运行,即是mysqld进程(或者说服务,Windows NT下面称为”服务“,unix下面为”进程“)已经在运行。然后运行下面的命令: vy I0~.
bin/mysql –p < /home/mark/New_Data.sql mUJ\`fQp!
接着按提示输入密码,如果上面的文件中的语句没有错误,那么这些数据就被导入到了数据库中。 hS<e]uQP
roM=] m9.,
命令行中使用LOAD DATA INFILE 从文件中导入数据到数据库: _v9 !{A-
现在您可能会问自己,"究竟为什么我要输入所有的这些SQL语句到文件中,然后通过程序运行它们呢?”这样看起来好像需要大量的工作。很好,你这样想很可能就对了。但是假如你有从所有这些命令中产生的log记录呢?现在这样就很棒,嗯,大多数数据库都会自动产生数据库中的事件记录的log。而大部分log都包含有用过的原始的SQL命令。因此,如果您不能从您现在的数据库中导出数据到新的mysql数据库中使用,那么您可以使用log和mysql的批处理特性,来快速且方便地导入您地数据。当然,这样就省去了打字的麻烦。 ^h5t{
LOAD DATA INFILE N!^8U=
这是我们要介绍的最后一个导入数据到MySQL数据库中的方法。这个命令与mysqlimport非常相似,但这个方法可以在mysql命令行中使用。也就是说您可以在所有使用API的程序中使用这个命令。使用这种方法,您就可以在应用程序中导入您想要导入的数据。 Mad5GgOI
2Gq3c}_`EQ
使用这个命令之前,mysqld进程(服务)必须已经在运行。启动mysql命令行: [6nFn?kE
bin/mysql –p OM" &E1J
按提示输入密码,成功进入mysql命令行之后,输入下面的命令: ~NJP\GyLu
USE Meet_A_Geek; 9m?L[af
LOAD DATA INFILE "/home/mark/data.sql" INTO TABLE Orders; n6HvAOah
简单的讲,这样将会把文件data.sql中的内容导入到表Orders中,如mysqlimport工具一样,这个命令也有一些可以选择的参数。比如您需要把自己的电脑上的数据导入到远程的数据库服务器中,您可以使用下面的命令: !v L!z3Z{
LOAD DATA LOCAL INFILE "C:\MyDocs\SQL.txt" INTO TABLE Orders; 1QmC5 U+
上面的LOCAL参数表示文件是本地的文件,服务器是您所登陆的服务器。这样就省去了使用ftp来上传文件到服务器,MySQL替你完成了. BibNvh
8$ue`(,
您也可以设置插入语句的优先级,如果您要把它标记为低优先级(LOW_PRIORITY),那么MySQL将会等到没有其他人读这个表的时候,才把插入数据。可以使用如下的命令: I3P?vQ\OV
LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" INTO TABLE Orders; y`RQ]}j[ \
您也可以指定是否在插入数据的时候,取代或者忽略文件与数据表中重复的键值。替代重复的键值的语法: HW`E1YdU(u
LOAD DATA LOW_PRIORITY INFILE "/home/mark/data.sql" REPLACE INTO TABLE Orders; 0g(fsiXk
上面的句子看起来有点笨拙,但却把关键字放在了让您的剖析器可以理解的地方。 UT [&v
cge"F\
下面的一对选项描述了文件的记录格式,这些选项也是在mysqlimport工具中可以用的。他们在这里看起来有点不同。首先,要用到FIELDS关键字,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项: ;MT8`Oq
TERMINATED BY character o S=U;*D.
ENCLOSED BY character Z!':S7,la
ESCAPED BY character @>?#4\*l
这些关键字与它们的参数跟mysqlimport中的用法是一样的. The MwpaM W7~
TERMINATED BY 描述字段的分隔符,默认情况下是tab字符(\t) req@S/
ENCLOSED BY描述的是字段的括起字符。比方以引号括起每一个字段。 ).WK_+]|DF
ESCAPED BY 描述的转义字符。默认的是反些杠(backslash:\ ). ME+0V5HT
下面仍然使用前面的mysqlimport命令的例子,用LOAD DATA INFILE语句把同样的文件导入到数据库中: !QF
LOAD DATA INFILE "/home/mark/Orders.txt" REPLACE INTO TABLE Orders FIELDS TERMINATED BY ',' ~, -d9^
ENCLOSED BY '"'; V(4R:8,0
LOAD DATA INFILE语句中有一个mysqlimport工具中没有特点:LOAD DATA INFILE 可以按指定的列把文件导入到数据库中。 Z~+yB`/pb7
当我们要把数据的一部分内容导入的时候,这个特点就很重要。比方说,我们要从Access数据库升级到MySQL数据库的时候,需要加入一些栏目(列/字段 /field)到MySQL数据库中,以适应一些额外的需要。这个时候,我们的Access数据库中的数据仍然是可用的,但是因为这些数据的栏目 (field)与MySQL中的不再匹配,因此而无法再使用mysqlimport工具。尽管如此,我们仍然可以使用LOAD DATA INFILE,下面的例子显示了如何向指定的栏目(field)中导入数据: YHafQ^
LOAD DATA INFILE "/home/Order.txt" INTO TABLE Orders(Order_Number, Order_Date, Customer_ID); q?V_:l:B
如您所见,我们可以指定需要的栏目(fields)。这些指定的字段依然是以括号括起,由逗号分隔的,如果您遗漏了其中任何一个,MySQL将会提醒您^_^