从数据库中导入数据
MySQLimport
1)MySQLimport的语法介绍:
MySQLimport位于MySQL/bin目录中,是MySQL的一个载入(或者说导入)数据的一个非常有效的工具。这是一个命令行工具。有两个参数以及大量的选项可供选择。这个工具把一个文本文件(textfile)导入到你指定的数据库和表中。比方说我们要从文件text.txt中把数据导入到数据库Meet_A_Geek中的表Custermers中:
MySQLimportMeet_A_Geektext.txt
注意:这里text.txt是我们要导入数据的文本文件,而Meet_A_Geek是我们要操作的数据库,数据库中的表名是Customers,这里文本文件的数据格式必须与Customers表中的记录格式一致,否则MySQLimport命令将会出错。
那么我们将把文件中的内容导入到数据库Meet_A_Geek中的Cus表中。
上面的例子中,只用到两个参数,并没有用到更多的选项,下面介绍MySQLimport的选项
2)MySQLimport的常用选项介绍:
选项功能
-dor--delete新数据导入数据表中之前删除数据数据表中的所有信息
-for--force不管是否遇到错误,MySQLimport将强制继续插入数据
-ior--ignoreMySQLimport跳过或者忽略那些有相同唯一关键字的行,导入文件中的数据将被忽略。
-lor-lock-tables数据被插入之前锁住表,这样就防止了,你在更新数据库时,用户的查询和更新受到影响。
-ror-replace这个选项与-i选项的作用相反;此选项将替代表中有相同唯一关键字的记录。
--fields-enclosed-by=char指定文本文件中数据的记录时以什么括起的,很多情况下数据以双引号括起。默认的情况下数据是没有被字符括起的。
--fields-terminated-by=char指定各个数据的值之间的分隔符,在句号分隔的文件中,分隔符是句号。可以用此选项指定数据之间的分隔符。
默认的分隔符是跳格符(Tab)
--lines-terminated-by=str此选项指定文本文件中行与行之间数据的分隔字符串或者字符。默认的情况下MySQLimport以newline为行分隔符。
可以选择用一个字符串来替代一个单个的字符:
一个新行或者一个回车。
MySQLimport命令常用的选项还有-v显示版本(version),-p提示输入密码(password)等。
3)入一个以逗号为分隔符的文件
文件中行的记录格式是这样的:
"1","ORD89876","1DozenRoses","19991226"
我们的任务是要把这个文件里面的数据导入到数据库Meet_A_Geek中的表格Orders中,我们使用这个命令:
bin/MySQLimport–prl–fields-enclosed-by="–fields-terminated-by=,Meet_A_GeekOrders.txt
这个命令可能看起来很不爽,不过当你熟悉了之后,这是非常简单的。第一部分,bin/MySQLimport,告诉操作系统你要运行的命令是MySQL/bin目录下的MySQLimport,选项p是要求输入密码,这样就要求你在改动数据库之前输入密码,操作起来会更安全。我们用了r选项是因为我们想要把表中的唯一关键字与文件记录中有重复唯一关键字的记录替换成文件中的数据。我们表单中的数据不是最新的,需要用文件中的数据去更新,因而就用r这个选项,替代数据库中已经有的记录。l选项的作用是在我们插入数据的时候锁住表,这样就阻止了用户在我们更新表的时候对表进行查询或者更改的操作。
批处理是一种非交互式运行MySQL程序的方法,如同在MySQL中使用的命令一样,你仍然将使用这些命令。
为了实现批处理,重定向一个文件到MySQL程序中,首先我们需要一个文本文件,这个文本文件包含有与我们在MySQL中输入的命令相同的文本。
比如我们要插入一些数据,使用包含下面文本的文件(文件名为New_Data.sql,当然我们也可以取名为New_Data.txt及任何其他的合法名字,并不一定要以后缀sql结尾):
USEMeet_A_Geek;
INSERTINTOCustomers(Customer_ID,Last_Name)VALUES(NULL,"Block");
INSERTINTOCustomers(Customer_ID,Last_Name)VALUES(NULL,"Newton");
INSERTINTOCustomers(Customer_ID,Last_Name)VALUES(NULL,"Simmons");
注意上面的这些句子的语法都必须是正确的,并且每个句子以分号结束。
上面的USE命令选择数据库,INSERT命令插入数据。
下面我们要把上面的文件导入到数据库中,导入之前要确认数据库已经在运行,即是MySQLd进程(或者说服务,WindowsNT下面称为”服务“,unix下面为”进程“)已经在运行。
然后运行下面的命令:
bin/MySQL–p
接着按提示输入密码,如果上面的文件中的语句没有错误,那么这些数据就被导入到了数据库中。
命令行中使用LOADDATAINFILE从文件中导入数据到数据库:
这个命令与MySQLimport非常相似,但这个方法可以在MySQL命令行中使用。也就是说可以在所有使用API的程序中使用这个命令。使用这种方法,就可以在应用程序中导入想要导入的数据。
使用这个命令之前,MySQLd进程(服务)必须已经在运行。
启动MySQL命令行:
bin/MySQL–p
按提示输入密码,成功进入MySQL命令行之后,输入下面的命令:
USEMeet_A_Geek;
LOADDATAINFILE"/home/mark/data.sql"INTOTABLEOrders;
简单的讲,这样将会把文件data.sql中的内容导入到表Orders中,如MySQLimport工具一样,这个命令也有一些可以选择的参数。比如需要把自己的电脑上的数据导入到远程的数据库服务器中,可以使用下面的命令:
LOADDATALOCALINFILE"C:\\MyDocs\\SQL.txt"INTOTABLEOrders;
上面的LOCAL参数表示文件是本地的文件,服务器是所登陆的服务器。
这样就省去了使用ftp来上传文件到服务器,MySQL替你完成了.
也可以设置插入语句的优先级,如果要把它标记为低优先级(LOW_PRIORITY),那么MySQL将会等到没有其他人读这个表的时候,才把插入数据。可以使用如下的命令:
LOADDATALOW_PRIORITYINFILE"/home/mark/data.sql"INTOTABLEOrders;
也可以指定是否在插入数据的时候,取代或者忽略文件与数据表中重复的键值。替代重复的键值的语法:
LOADDATALOW_PRIORITYINFILE"/home/mark/data.sql"REPLACEINTOTABLEOrders;
下面的一对选项描述了文件的记录格式,这些选项也是在MySQLimport工具中可以用的。他们在这里看起来有点不同。首先,要用到FIELDS关键字,如果用到这个关键字,MySQL剖析器希望看到至少有下面的一个选项:
TERMINATEDBYcharacter
ENCLOSEDBYcharacter
ESCAPEDBYcharacter
这些关键字与它们的参数跟MySQLimport中的用法是一样的.The
TERMINATEDBY描述字段的分隔符,默认情况下是tab字符(\\t)
ENCLOSEDBY描述的是字段的括起字符。比方以引号括起每一个字段。
ESCAPEDBY描述的转义字符。默认的是反些杠(backslash:\\).
下面仍然使用前面的MySQLimport命令的例子,用LOADDATAINFILE语句把同样的文件导入到数据库中:
LOADDATAINFILE"/home/mark/Orders.txt"REPLACEINTOTABLEOrdersFIELDSTERMINATEDBY','
ENCLOSEDBY'"';
LOADDATAINFILE语句中有一个MySQLimport工具中没有特点:
LOADDATAINFILE可以按指定的列把文件导入到数据库中。
当我们要把数据的一部分内容导入的时候,这个特点就很重要。比方说,我们要从Access数据库升级到MySQL数据库的时候,需要加入一些栏目(列/字段/field)到MySQL数据库中,以适应一些额外的需要。
这个时候,我们的Access数据库中的数据仍然是可用的,但是因为这些数据的栏目(field)与MySQL中的不再匹配,因此而无法再使用MySQLimport工具。尽管如此,我们仍然可以使用LOADDATAINFILE,下面的例子显示了如何向指定的栏目(field)中导入数据:
LOADDATAINFILE"/home/Order.txt"INTOTABLEOrders(Order_Number,Order_Date,Customer_ID);
如所见,我们可以指定需要的栏目(fields)。这些指定的字段依然是以括号括起,由逗号分隔的,如果遗漏了其中任何一个,MySQL将会提醒
ImportingDatafromMicrosoftAccess(从Access中导入数据,略)
从数据库中导出数据
可以看到MySQL有很多可以导入数据的方法,然而这些只是数据传输中的一半。另外的一般是从MySQL数据库中导出数据。有许多的原因我们需要导出数据。一个重要的原因是用于备份数据库。数据的造价常常是昂贵的,需要谨慎处理它们。经常地备份可以帮助防止宝贵数据地丢失;另外一个原因是,也许希望导出数据来共享。在这个信息技术不断成长的世界中,共享数据变得越来越常见。
使用MySQLdump:
MySQLdump命令位于MySQL/bin/目录中
MySQLdump工具很多方面类似相反作用的工具MySQLimport。它们有一些同样的选项。但MySQLdump能够做更多的事情。它可以把整个数据库装载到一个单独的文本文件中。这个文件包含有所有重建的数据库所需要的SQL命令。这个命令取得所有的模式(Schema,后面有解释)并且将其转换成DDL语法(CREATE语句,即数据库定义语句),取得所有的数据,并且从这些数据中创建INSERT语句。这个工具将的数据库中所有的设计倒转。因为所有的东西都被包含到了一个文本文件中。这个文本文件可以用一个简单的批处理和一个合适SQL语句导回到MySQL中。这个工具令人难以置信地简单而快速。决不会有半点让人头疼地地方。
因此,如果像装载整个数据库Meet_A_Geek的内容到一个文件中,可以使用下面的命令:
bin/MySQLdump–pMeet_A_Geek>MeetAGeek_Dump_File.txt
这个语句也允许指定一个表进行dump(备份/导出/装载?)。如果只是希望把数据库Meet_A_Geek中的表Orders中的整个内容导出到一个文件,可以使用下面的命令:
bin/MySQLdump–pMeet_A_GeekOrders>MeetAGeek_Orders.txt
这个非常的灵活,甚至可以使用WHERE从句来选择需要的记录导出到文件中。要达到这样的目的,可以使用类似于下面的命令:
bin/MySQLdump–p–where="Order_ID>2000"Meet_A_GeekOrders>Special_Dump.txt
MySQLdump工具有大量的选项,部分选项如下表:
选项/Option作用/ActionPerformed
--add-drop-table
这个选项将会在每一个表的前面加上DROPTABLEIFEXISTS语句,这样可以保证导回MySQL数据库的时候不会出错,因为每次导回的时候,都会首先检查表是否存在,存在就删除
--add-locks
这个选项会在INSERT语句中捆上一个LOCKTABLE和UNLOCKTABLE语句。这就防止在这些记录被再次导入数据库时其他用户对表进行的操作
-cor-complete_insert
这个选项使得MySQLdump命令给每一个产生INSERT语句加上列(field)的名字。当把数据导出导另外一个数据库时这个选项很有用。
--delayed-insert在INSERT命令中加入DELAY选项
-For-flush-logs使用这个选项,在执行导出之前将会刷新MySQL服务器的log.
-for-force使用这个选项,即使有错误发生,仍然继续导出
--full这个选项把附加信息也加到CREATETABLE的语句中
-lor-lock-tables使用这个选项,导出表的时候服务器将会给表加锁。
-tor-no-create-info
这个选项使的MySQLdump命令不创建CREATETABLE语句,这个选项在只需要数据而不需要DDL(数据库定义语句)时很方便。
-dor-no-data这个选项使的MySQLdump命令不创建INSERT语句。
在只需要DDL语句时,可以使用这个选项。
--opt此选项将打开所有会提高文件导出速度和创造一个可以更快导入的文件的选项。
-qor-quick这个选项使得MySQL不会把整个导出的内容读入内存再执行导出,而是在读到的时候就写入导文件中。
-Tpathor-tab=path这个选项将会创建两个文件,一个文件包含DDL语句或者表创建语句,另一个文件包含数据。DDL文件被命名为table_name.sql,数据文件被命名为table_name.txt.路径名是存放这两个文件的目录。目录必须已经存在,并且命令的使用者有对文件的特权。
-w"WHEREClause"or-where="Whereclause"
如前面所讲的,可以使用这一选项来过筛选将要放到导出文件的数据。
假定需要为一个表单中要用到的帐号建立一个文件,经理要看今年(2004年)所有的订单(Orders),它们并不对DDL感兴趣,并且需要文件有逗号分隔,因为这样就很容易导入到Excel中。为了完成这个人物,可以使用下面的句子:
bin/MySQLdump–p–where"Order_Date>='2000-01-01'"
–tab=/home/mark–no-create-info–fields-terminated-by=,Meet_A_GeekOrders
这将会得到想要的结果。