1.5 与mysql 交互的技巧
本节介绍怎样更有效地且键入工作量较小地与mysql 客户机程序进行交互。介绍怎样更简单地与服务器连接,以及怎样不用每次都从头开始键入查询。
1.5.1 简化连接过程
在激活mysql 时,有可能需要指定诸如主机名、用户名或口令这样的连接参数。运行一个程序需要做很多输入工作,这很快就会让人厌烦。有几种方法可最小化所做的键入工作,使连接更为容易,它们分别为:
■ 利用选项文件存储连接参数。
■ 利用外壳程序的命令历史重复命令。
■ 利用外壳程序的别名或脚本定义mysql 命令行快捷键。
1. 利用选项文件
自版本3.22 以来,MySQL 允许在一个选项文件中存储连接参数。然后在运行mysql 时就不用重复键入这些参数了;仅当您曾经在命令行上键入过它们时可以使用。这些参数也可以为其他MySQL 客户机所用,如为mysqlimport 所用。这也表示在使用这些程序时,选项文件减少了键入工作。为了利用选项文件方法指定连接参数,可建立一个名为~ / . m y.cnf (即主目录中的一个名为. m y.cnf 的文件)。选项文件是一个无格式的文本文件,因此可用任何文本编辑器来创建它。文件的内容所下所示:
[client] 行标记客户机选项组的开始;它后跟的所有行都是为MySQL 客户机程序获得选项值准备的,这些行一直沿续到文件的结尾或另一不同的参数组的开始。在连接到服务器时,用指定的主机名、用户名和口令替换s e r v e r h o s t、yourname 和y o u r p a s s。对于笔者来说,. m y.cnf 如下所示:
只有[client] 行是必须的。定义参数值的行都是可选的;可以仅指定那些所需要的参数。例如,如果您的MySQL 用户名与UNIX 的登录名相同,则不需要包括user 行。在创建了. m y.cnf 文件后,设置其访问方式为某个限定值以保证别人不能读取它:
在Windows 下,选项文件的内容是相同的,但其名称不同( c : \ m y. c n f),而且不调用chmod 命令。因为选项文件在版本3.22 前未加到M y S Q L,所以更早的版本不能使用它们。特别是在Windows 下,您不能与共享MySQL 分发包一起得到的客户机使用选项文件,因为它是基于MySQL 3.21 的。选项文件在注册过的MySQL 的Windows 版本下工作得很好,否则可以从MySQL Web 站点取得更新的支持选项文件的客户机。关于选项文件的详细内容可参阅附录E“MySQL 程序参考”。
2. 利用外壳程序的命令历史诸如c s h、tcsh 和bash 这样的外壳程序会在一个历史列表中记下您的命令,并允许重复该列表中的命令。如果采用的是这样的外壳程序,其历史列表可帮助免除完整命令的键入。例如,如果最近调用了m y s q l,可按如下命令再次执行它:% !my 其中“!”告诉外壳程序搜索整个命令历史找到最近以“ m y”开头的命令,并像您打入的一样发布它。有的外壳程序还允许利用上箭头和下箭头键(或许是Ctrl-P 和C t r l - N)在历史列表中上下移动。可用这种方法选择想要的命令,然后按Enter 执行它。tcsh 和bash 有这种功能,而其他外壳程序也可能有。可参阅相应的外壳程序以找到更多使用历史列表的内容。
3. 利用外壳程序的别名或脚本如果使用的外壳程序提供别名功能,那么可以设置允许通过键入简短名调用长命令的命令快捷键。例如,在csh 或tcsh 中,可利用alias 命令设置名为samp_db 的别名,如下所示:
而bash 中的语法稍有不同:
可以定义一个别名使这两个命令等价:
显然,第一个比第二个更好键入。为了使这些别名在每次登录时都起作用,可将在外壳程序设置文件中放入一个alias 命令(如,csh 放入. c s h r c,而bash 放入. b a s h _ p r o f i l e)。快捷键的其他形式是建立利用适当的选项执行mysql 的外壳程序脚本。在UNIX 中,等价于samp_db 别名的脚本文件如下所示:
如果笔者命名此脚本为samp_db 并使其可执行(用chmod +x samp_db),那么可以键入samp_db 运行mysql 并连接到笔者的数据库中。在Windows 下,可用批命令文件来完成相同的工作。命名文件s a m p _ d b . b a t,并在其中放入如下的行:
此批命令文件可通过在DOS 控制台提示符下键入samp_db 来执行,也可以双击它的Windows 图标来执行。如果访问多个数据库或连接到多个主机,则可以定义几个别名或脚本,每一个都用不同的选项调用m y s q l。
1.5.2 以较少的键入发布查询
mysql 是一个与数据库进行交互的极为有用的程序,但是其界面最适合于简短的、单行的查询。当然, mysql 自身并不关心某个查询是否分成多行,但是长的查询很不好键入。输入一条查询也不是很有趣的事,即使是一条较短的查询也是如此,除非发现有错误才愿意重新键入它。
有几种可用来避免不必要的键入或重新键入的技巧:
■ 利用mysql 的输入行编辑功能。
■ 利用拷贝和粘贴。
■ 以批方式运行m y s q l。
■ 利用现有数据来创建新记录以避免键入I N S E RT 语句。
1. 利用mysql 的输入行编辑器
mysql 具有内建的GNU Readline 库,允许对输入行进行编辑。可以对当前录入的行进行处理,或调出以前输入的行并重新执行它们(原样执行或做进一步的修改后执行)。在录入一行并发现错误时,这是非常方便的;您可以在按Enter 键前,在行内退格并进行修正。如果录入了一个有错的查询,那么可以调用该查询并对其进行编辑以解决问题,然后再重新提交它。(如果您在一行上键入了整个查询,这是最容易的方法。)表1-4 中列出了一些非常有用的编辑序列,除了此表中给出的以外,还有许多输入编辑命令。利用因特网搜索引擎,应该能够找到R e a d l i n e手册的联机版本。此手册也包含在Readline 分发包中,可在h t t p : / / w w w.gnu. org/ 的GN U Web 站点得到。
下面的例子描述了输入编辑的一个简单的使用。假定用mysql 输入了下列查询:
如果在按Enter 前,已经注意到将“ p r e s i d e n t”错拼成了“ p e r s i d e n t”,则可按左箭头或Ctrl-B 多次移动光标到“s”的左边。然后按Delete 两次删除“ e r”,键入“r e”改正错误,并按Enter 发布此查询。如果没注意到错拼就按了E n t e r,也不会有问题。在mysql 显示了错误消息后,按上箭头或Ctrl-P 调出该行,然后对其进行编辑。
输入行编辑在mysql 的Windows 版中不起作用,但是可从MySQL Web 站点取得免费的cygwin_32 客户机分发包。在该分发包中的mysqlc 程序与mysql 一样,但它支持输入行编辑命令。
2. 利用拷贝和粘贴发布查询
如果是在窗口环境下工作,可将认为有用的查询文本保存在一个文件中并利用拷贝和粘贴操作很容易地发布这些命令。其工作过程如下:
1) 在Te l n e t窗口或DOS 控制窗口中激活m y s q l。
2) 在一个文档窗口打开包含查询的文件。(如笔者在Mac OS 下使用B B E d i t,在U N I X中使用X Window System 下的xterm 窗口中的v i。)
3) 为了执行存放在文件中的某个查询,选择并拷贝它。然后切换到Telnet 窗口或DOS 控制台,并将该查询粘贴到m y s q l。这个过程写起来似乎有点令人讨厌,但它是一个快速录入查询的很容易的方法,实际使用时不用键入查询。这个方法也允许在文档窗口中对查询进行编辑,而且它允许拷贝和粘贴现有查询来构造一个新的查询。例如,如果您经常从某个特定的表中选择行,但是喜欢查看以不同方式存放的输出结果,则可以在文档窗口中保存一个不同的ORDER BY 子句的列表,然后为任意的特定查询拷贝和粘贴想使用的那个子句。也可按其他方向拷贝和粘贴(从Telnet 到查询文件)。在mysql 中录入行时,它们被保存在您的主目录中的名为.mysql_history 的文件中。如果您手工录入了一个希望保存起来今后使用的查询,可退出m y s q l,在某个编辑器中打开. m y s q l _ h i s t o r y,然后从.mysql_history 拷贝和粘贴此查询到您的查询文件。
3. 以批方式运行mysql不一定必须交互式地运行m y s q l。mysql 能够以非交互式(批)方式从某个文件中读取输入。这对于定期运行的查询是很有用的,因为您一定不希望每次运行此查询时都要重新键入它。只要一次性地将其放入一个文件,然后让mysql 在需要时执行该文件的内容即可。假定有一个查询查找member 表的interests 列,以找出那些对美国历史的某个方面感兴趣的历史同盟会员。如查找对大萧条期有兴趣的会员,可编写此查询如下(注意结尾处有一个分号,从而mysql 能够知道查询语句在何处结束):
为了使用此查询来找出对Thomas Jefferson 感兴趣的会员,可以编辑此查询文件将depression 更改为Je fferson 并再次运行m y s q l。只要不很经常使用此查询,它工作得很好。如果经常使用,则需要更好的方法。使用此查询更为灵活的一种方法是将其放入一个外壳程序脚本中,此脚本从脚本命令行取一个参数并利用它来更改查询的文本。这样确定查询的参数,使得能够在运行脚本时指定令人感兴趣的关键字。为了了解这如何起作用,按如下编写一个较小的外壳程序脚本i n t e r e s t s . s h:
其中第二行保证在命令行上有一个关键字;它显示一条简短的消息,或者退出。在< < Q U E RY_INPUT 和最后的Q U E RY_INPUT 之间的所有内容成为mysql 的输入。在查询文本中,外壳程序用来自命令行的关键字替换$ 1。(在外壳程序脚本中, $ 1、$ 2 . . .为命令参数。)这使相应的查询反映了执行此脚本时在命令行上指定的关键字。在能够运行此脚本前,必须使其可执行:
现在不需要在每次运行脚本时对其进行编辑了。只要在命令行上告诉它需要查找什么就行了。如下所示:
4. 利用现有数据来创建新记录
可以用I N S E RT 语句每次一行地将新记录追加到表中,但是在通过手工键入I N S E RT 语句建立几个新记录后,多数人都会意识到应该有更好的追加记录的方法。一种选择是利用仅含有数据值的文件,然后利用LOAD DATA 语句或mysqlimport 实用程序从该文件中装入记录。通常,可利用已经以某种格式存在的数据来建立数据文件。这些数据信息可能包含在电子表中,或许在某个其他数据库中,应该将它们转换到MySQL。为了介绍起来简单,我们假定这些数据是在桌面微计算机的电子表中。要将电子表数据从桌面微计算机中转换到您的UNIX 账号下的某个文件中,可结合Telnet 利用拷贝和粘贴。具体工作如下所示:1) 打开UNIX 账号的一个Telnet 连接。在Mac OS 下,可利用诸如Better Telnet 或N CSA Telnet 这样的应用程序。在Windows 下,可使用标准的Telnet 程序。
2) 打开电子表,选择想转换的数据块,拷贝它。
3) 在Telnet 窗中,键入下列命令开始获取数据到文件data.txt。
cat 命令等待输入。
4) 将从电子表拷贝来的数据粘贴到Telnet 窗口。cat 认为您正在键入信息并忠实地将它写入到data.txt 文件。
5) 在所有粘贴数据已经写入该文件后,如果光标停止在数据行的结尾处而不是停止在新行的开始,按Enter。然后,按Ctrl-D 以指示“文件结束”。cat 停止输入等待并关闭data.txt文件。现在已经得到了包含有电子表中选择的数据块的data.txt 文件,此文件已作好由LOAD DATA mysqlimport 加载到数据库的准备。
拷贝和粘贴是一种将数据传入UNIX 文件的快速且简易的方法,但它最适合较小的数据集。量较大的数据可能会超出系统拷贝缓冲区。在这样的情况下,最好是以无格式文本(制表符分隔)的形式保存电子表。然后可利用FTP 将相应文件从微机上传送到UNIX 账号。转换文本模式(非二进制或影像模式)的文件以便行结束符转换为UNIX 的行结束符。(U N I X利用换行符、Mac OS 利用回车换行符、Windows 利用回车换行符/换行符对作为行结束符。)可告诉LOAD DATA 或mysqlimport 寻找什么换行符,但是在UNIX 下,对含换行符的文件处理要更容易一些。
在转换了文件之后,应该检查一下在结尾处是否具空白行。如果有,应该将它们删除,否则在将该文件装载到数据库时,这些空白行将会转换为空白或畸形的记录。来自电子表格以无格式文本保存的文件,或具有能括住包含空格的值的括号。为了在将该文件装入数据库时去掉这些括号,可利用LOAD DATA 的FIELDS ENCLOSED BY 子句,或利用mysqlimport 的--fields - enclosed - by 选项。更详细的信息请参看附录D 中LOAD DATA 的相应项。
1.6 向何处去
现在我们已经介绍了许多使用MySQL 的知识。您已经知道了怎样设置数据库并创建表。能够将记录放入这些表中,并以各种方式对其进行检索,更改或删除。但是要掌握M y S Q L仍然有许多知识要学,本章中的教程仅仅给出了一些浅显的东西。通过考察我们的样例数据库就会明白这一点。我们创建了样例数据库及其表,并用一些初始的数据对其进行了填充。在这个工作过程中,我们明白了怎样编写查询,回答关于数据库中信息的某些问题,但是还有许多工作要做。
例如,我们没有方便的交互方式来输入学分保存方案的新学分记录,或输入历史同盟地址名录的会员条目。还没有方便的方法来编辑现有记录,而且我们仍然不能生成印刷或联机形式的同盟地址名录。这些任务以及一些其他的任务将在以后的各章中陆续地进行介绍,特别是在第7章“Perl DBI API”和第8 章“PHP API”中将要进行详细地介绍。
下一步将阅读本书中哪部分取决于您对什么内容感兴趣。如果希望了解怎样完成已经以
历史同盟和学分保存方案开始的工作,可看第一部分有关MySQL 程序设计的内容。如果打算成为某个站点的MySQL 管理员,本书的第三部分将对管理工作做较多的介绍。但是,笔者建议通过阅读第一部分中的其余各章,首先获得使用MySQL 的一般背景知识。
这些章节讨论了MySQL 怎样处理数据,进一步提供有关语法和查询语句的用途,并且说明了怎样使查询运行得更快。不管您在什么环境中使用M y S Q L,不管是运行mysql 还是编写自己的程序,
还是作为数据库管理员,用这些内容打下一个良好的基础将有助于您站在一个较高的起点上。