1.5 與mysql 交互的技巧
本節(jié)介紹怎樣更有效地且鍵入工作量較小地與mysql 客戶機程序進行交互。介紹怎樣更簡單地與服務器連接,以及怎樣不用每次都從頭開始鍵入查詢。
1.5.1 簡化連接過程
在激活mysql 時,有可能需要指定諸如主機名、用戶名或口令這樣的連接參數(shù)。運行一個程序需要做很多輸入工作,這很快就會讓人厭煩。有幾種方法可最小化所做的鍵入工作,使連接更為容易,它們分別為:
■ 利用選項文件存儲連接參數(shù)。
■ 利用外殼程序的命令歷史重復命令。
■ 利用外殼程序的別名或腳本定義mysql 命令行快捷鍵。
1. 利用選項文件
自版本3.22 以來,MySQL 允許在一個選項文件中存儲連接參數(shù)。然后在運行mysql 時就不用重復鍵入這些參數(shù)了;僅當您曾經(jīng)在命令行上鍵入過它們時可以使用。這些參數(shù)也可以為其他MySQL 客戶機所用,如為mysqlimport 所用。這也表示在使用這些程序時,選項文件減少了鍵入工作。為了利用選項文件方法指定連接參數(shù),可建立一個名為~ / . m y.cnf (即主目錄中的一個名為. m y.cnf 的文件)。選項文件是一個無格式的文本文件,因此可用任何文本編輯器來創(chuàng)建它。文件的內容所下所示:

[client] 行標記客戶機選項組的開始;它后跟的所有行都是為MySQL 客戶機程序獲得選項值準備的,這些行一直沿續(xù)到文件的結尾或另一不同的參數(shù)組的開始。在連接到服務器時,用指定的主機名、用戶名和口令替換s e r v e r h o s t、yourname 和y o u r p a s s。對于筆者來說,. m y.cnf 如下所示:

只有[client] 行是必須的。定義參數(shù)值的行都是可選的;可以僅指定那些所需要的參數(shù)。例如,如果您的MySQL 用戶名與UNIX 的登錄名相同,則不需要包括user 行。在創(chuàng)建了. m y.cnf 文件后,設置其訪問方式為某個限定值以保證別人不能讀取它:

在Windows 下,選項文件的內容是相同的,但其名稱不同( c : \ m y. c n f),而且不調用chmod 命令。因為選項文件在版本3.22 前未加到M y S Q L,所以更早的版本不能使用它們。特別是在Windows 下,您不能與共享MySQL 分發(fā)包一起得到的客戶機使用選項文件,因為它是基于MySQL 3.21 的。選項文件在注冊過的MySQL 的Windows 版本下工作得很好,否則可以從MySQL Web 站點取得更新的支持選項文件的客戶機。關于選項文件的詳細內容可參閱附錄E“MySQL 程序參考”。
2. 利用外殼程序的命令歷史諸如c s h、tcsh 和bash 這樣的外殼程序會在一個歷史列表中記下您的命令,并允許重復該列表中的命令。如果采用的是這樣的外殼程序,其歷史列表可幫助免除完整命令的鍵入。例如,如果最近調用了m y s q l,可按如下命令再次執(zhí)行它:% !my 其中“!”告訴外殼程序搜索整個命令歷史找到最近以“ m y”開頭的命令,并像您打入的一樣發(fā)布它。有的外殼程序還允許利用上箭頭和下箭頭鍵(或許是Ctrl-P 和C t r l - N)在歷史列表中上下移動。可用這種方法選擇想要的命令,然后按Enter 執(zhí)行它。tcsh 和bash 有這種功能,而其他外殼程序也可能有??蓞㈤喯鄳耐鈿こ绦蛞哉业礁嗍褂脷v史列表的內容。
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)??旖萱I的其他形式是建立利用適當?shù)倪x項執(zhí)行mysql 的外殼程序腳本。在UNIX 中,等價于samp_db 別名的腳本文件如下所示:

如果筆者命名此腳本為samp_db 并使其可執(zhí)行(用chmod +x samp_db),那么可以鍵入samp_db 運行mysql 并連接到筆者的數(shù)據(jù)庫中。在Windows 下,可用批命令文件來完成相同的工作。命名文件s a m p _ d b . b a t,并在其中放入如下的行:

此批命令文件可通過在DOS 控制臺提示符下鍵入samp_db 來執(zhí)行,也可以雙擊它的Windows 圖標來執(zhí)行。如果訪問多個數(shù)據(jù)庫或連接到多個主機,則可以定義幾個別名或腳本,每一個都用不同的選項調用m y s q l。
1.5.2 以較少的鍵入發(fā)布查詢
mysql 是一個與數(shù)據(jù)庫進行交互的極為有用的程序,但是其界面最適合于簡短的、單行的查詢。當然, mysql 自身并不關心某個查詢是否分成多行,但是長的查詢很不好鍵入。輸入一條查詢也不是很有趣的事,即使是一條較短的查詢也是如此,除非發(fā)現(xiàn)有錯誤才愿意重新鍵入它。
有幾種可用來避免不必要的鍵入或重新鍵入的技巧:
■ 利用mysql 的輸入行編輯功能。
■ 利用拷貝和粘貼。
■ 以批方式運行m y s q l。
■ 利用現(xiàn)有數(shù)據(jù)來創(chuàng)建新記錄以避免鍵入I N S E RT 語句。
1. 利用mysql 的輸入行編輯器
mysql 具有內建的GNU Readline 庫,允許對輸入行進行編輯??梢詫Ξ斍颁浫氲男羞M行處理,或調出以前輸入的行并重新執(zhí)行它們(原樣執(zhí)行或做進一步的修改后執(zhí)行)。在錄入一行并發(fā)現(xiàn)錯誤時,這是非常方便的;您可以在按Enter 鍵前,在行內退格并進行修正。如果錄入了一個有錯的查詢,那么可以調用該查詢并對其進行編輯以解決問題,然后再重新提交它。(如果您在一行上鍵入了整個查詢,這是最容易的方法。)表1-4 中列出了一些非常有用的編輯序列,除了此表中給出的以外,還有許多輸入編輯命令。利用因特網(wǎng)搜索引擎,應該能夠找到R e a d l i n e手冊的聯(lián)機版本。此手冊也包含在Readline 分發(fā)包中,可在h t t p : / / w w w.gnu. org/ 的GN U Web 站點得到。

下面的例子描述了輸入編輯的一個簡單的使用。假定用mysql 輸入了下列查詢:

如果在按Enter 前,已經(jīng)注意到將“ 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 發(fā)布此查詢。如果沒注意到錯拼就按了E n t e r,也不會有問題。在mysql 顯示了錯誤消息后,按上箭頭或Ctrl-P 調出該行,然后對其進行編輯。
輸入行編輯在mysql 的Windows 版中不起作用,但是可從MySQL Web 站點取得免費的cygwin_32 客戶機分發(fā)包。在該分發(fā)包中的mysqlc 程序與mysql 一樣,但它支持輸入行編輯命令。
2. 利用拷貝和粘貼發(fā)布查詢
如果是在窗口環(huán)境下工作,可將認為有用的查詢文本保存在一個文件中并利用拷貝和粘貼操作很容易地發(fā)布這些命令。其工作過程如下:
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) 為了執(zhí)行存放在文件中的某個查詢,選擇并拷貝它。然后切換到Telnet 窗口或DOS 控制臺,并將該查詢粘貼到m y s q l。這個過程寫起來似乎有點令人討厭,但它是一個快速錄入查詢的很容易的方法,實際使用時不用鍵入查詢。這個方法也允許在文檔窗口中對查詢進行編輯,而且它允許拷貝和粘貼現(xiàn)有查詢來構造一個新的查詢。例如,如果您經(jīng)常從某個特定的表中選擇行,但是喜歡查看以不同方式存放的輸出結果,則可以在文檔窗口中保存一個不同的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 在需要時執(zhí)行該文件的內容即可。假定有一個查詢查找member 表的interests 列,以找出那些對美國歷史的某個方面感興趣的歷史同盟會員。如查找對大蕭條期有興趣的會員,可編寫此查詢如下(注意結尾處有一個分號,從而mysql 能夠知道查詢語句在何處結束):

為了使用此查詢來找出對Thomas Jefferson 感興趣的會員,可以編輯此查詢文件將depression 更改為Je fferson 并再次運行m y s q l。只要不很經(jīng)常使用此查詢,它工作得很好。如果經(jīng)常使用,則需要更好的方法。使用此查詢更為靈活的一種方法是將其放入一個外殼程序腳本中,此腳本從腳本命令行取一個參數(shù)并利用它來更改查詢的文本。這樣確定查詢的參數(shù),使得能夠在運行腳本時指定令人感興趣的關鍵字。為了了解這如何起作用,按如下編寫一個較小的外殼程序腳本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 . . .為命令參數(shù)。)這使相應的查詢反映了執(zhí)行此腳本時在命令行上指定的關鍵字。在能夠運行此腳本前,必須使其可執(zhí)行:

現(xiàn)在不需要在每次運行腳本時對其進行編輯了。只要在命令行上告訴它需要查找什么就行了。如下所示:

4. 利用現(xiàn)有數(shù)據(jù)來創(chuàng)建新記錄
可以用I N S E RT 語句每次一行地將新記錄追加到表中,但是在通過手工鍵入I N S E RT 語句建立幾個新記錄后,多數(shù)人都會意識到應該有更好的追加記錄的方法。一種選擇是利用僅含有數(shù)據(jù)值的文件,然后利用LOAD DATA 語句或mysqlimport 實用程序從該文件中裝入記錄。通常,可利用已經(jīng)以某種格式存在的數(shù)據(jù)來建立數(shù)據(jù)文件。這些數(shù)據(jù)信息可能包含在電子表中,或許在某個其他數(shù)據(jù)庫中,應該將它們轉換到MySQL。為了介紹起來簡單,我們假定這些數(shù)據(jù)是在桌面微計算機的電子表中。要將電子表數(shù)據(jù)從桌面微計算機中轉換到您的UNIX 賬號下的某個文件中,可結合Telnet 利用拷貝和粘貼。具體工作如下所示:1) 打開UNIX 賬號的一個Telnet 連接。在Mac OS 下,可利用諸如Better Telnet 或N CSA Telnet 這樣的應用程序。在Windows 下,可使用標準的Telnet 程序。
2) 打開電子表,選擇想轉換的數(shù)據(jù)塊,拷貝它。
3) 在Telnet 窗中,鍵入下列命令開始獲取數(shù)據(jù)到文件data.txt。

cat 命令等待輸入。
4) 將從電子表拷貝來的數(shù)據(jù)粘貼到Telnet 窗口。cat 認為您正在鍵入信息并忠實地將它寫入到data.txt 文件。
5) 在所有粘貼數(shù)據(jù)已經(jīng)寫入該文件后,如果光標停止在數(shù)據(jù)行的結尾處而不是停止在新行的開始,按Enter。然后,按Ctrl-D 以指示“文件結束”。cat 停止輸入等待并關閉data.txt文件?,F(xiàn)在已經(jīng)得到了包含有電子表中選擇的數(shù)據(jù)塊的data.txt 文件,此文件已作好由LOAD DATA mysqlimport 加載到數(shù)據(jù)庫的準備。
拷貝和粘貼是一種將數(shù)據(jù)傳入UNIX 文件的快速且簡易的方法,但它最適合較小的數(shù)據(jù)集。量較大的數(shù)據(jù)可能會超出系統(tǒng)拷貝緩沖區(qū)。在這樣的情況下,最好是以無格式文本(制表符分隔)的形式保存電子表。然后可利用FTP 將相應文件從微機上傳送到UNIX 賬號。轉換文本模式(非二進制或影像模式)的文件以便行結束符轉換為UNIX 的行結束符。(U N I X利用換行符、Mac OS 利用回車換行符、Windows 利用回車換行符/換行符對作為行結束符。)可告訴LOAD DATA 或mysqlimport 尋找什么換行符,但是在UNIX 下,對含換行符的文件處理要更容易一些。
在轉換了文件之后,應該檢查一下在結尾處是否具空白行。如果有,應該將它們刪除,否則在將該文件裝載到數(shù)據(jù)庫時,這些空白行將會轉換為空白或畸形的記錄。來自電子表格以無格式文本保存的文件,或具有能括住包含空格的值的括號。為了在將該文件裝入數(shù)據(jù)庫時去掉這些括號,可利用LOAD DATA 的FIELDS ENCLOSED BY 子句,或利用mysqlimport 的--fields - enclosed - by 選項。更詳細的信息請參看附錄D 中LOAD DATA 的相應項。
1.6 向何處去
現(xiàn)在我們已經(jīng)介紹了許多使用MySQL 的知識。您已經(jīng)知道了怎樣設置數(shù)據(jù)庫并創(chuàng)建表。能夠將記錄放入這些表中,并以各種方式對其進行檢索,更改或刪除。但是要掌握M y S Q L仍然有許多知識要學,本章中的教程僅僅給出了一些淺顯的東西。通過考察我們的樣例數(shù)據(jù)庫就會明白這一點。我們創(chuàng)建了樣例數(shù)據(jù)庫及其表,并用一些初始的數(shù)據(jù)對其進行了填充。在這個工作過程中,我們明白了怎樣編寫查詢,回答關于數(shù)據(jù)庫中信息的某些問題,但是還有許多工作要做。
例如,我們沒有方便的交互方式來輸入學分保存方案的新學分記錄,或輸入歷史同盟地址名錄的會員條目。還沒有方便的方法來編輯現(xiàn)有記錄,而且我們仍然不能生成印刷或聯(lián)機形式的同盟地址名錄。這些任務以及一些其他的任務將在以后的各章中陸續(xù)地進行介紹,特別是在第7章“Perl DBI API”和第8 章“PHP API”中將要進行詳細地介紹。
下一步將閱讀本書中哪部分取決于您對什么內容感興趣。如果希望了解怎樣完成已經(jīng)以
歷史同盟和學分保存方案開始的工作,可看第一部分有關MySQL 程序設計的內容。如果打算成為某個站點的MySQL 管理員,本書的第三部分將對管理工作做較多的介紹。但是,筆者建議通過閱讀第一部分中的其余各章,首先獲得使用MySQL 的一般背景知識。
這些章節(jié)討論了MySQL 怎樣處理數(shù)據(jù),進一步提供有關語法和查詢語句的用途,并且說明了怎樣使查詢運行得更快。不管您在什么環(huán)境中使用M y S Q L,不管是運行mysql 還是編寫自己的程序,
還是作為數(shù)據(jù)庫管理員,用這些內容打下一個良好的基礎將有助于您站在一個較高的起點上。