本節介紹怎樣更有效地且鍵入工作量較小地與MySQL客戶機程序進行交互。介紹怎樣更簡單地與服務器連接,以及怎樣不用每次都從頭開始鍵入查詢。
1.5.1簡化連接過程
在激活MySQL時,有可能需要指定諸如主機名、用戶名或口令這樣的連接參數。運行一個程序需要做很多輸入工作,這很快就會讓人厭煩。有幾種方法可最小化所做的鍵入工作,使連接更為容易,它們分別為:
■ 利用選項文件存儲連接參數。
■ 利用外殼程序的命令歷史重復命令。
■ 利用外殼程序的別名或腳本定義MySQL命令行快捷鍵。
1. 利用選項文件
自版本3.22 以來,MySQL允許在一個選項文件中存儲連接參數。然後在運行mysql時就不用重復鍵入這些參數了;僅當您曾經在命令行上鍵入過它們時可以使用。這些參數也可以為其他MySQL客戶機所用,如為MySQLimport 所用。這也表示在使用這些程序時,選項文件減少了鍵入工作。為了利用選項文件方法指定連接參數,可建立一個名為~ /.my.cnf (即主目錄中的一個名為.my.cnf 的文件)。選項文件是一個無格式的文本文件,因此可用任何文本編輯器來創建它。文件的內容所下所示:
[clIEnt] 行標記客戶機選項組的開始;它後跟的所有行都是為MySQL客戶機程序獲得選項值准備的,這些行一直沿續到文件的結尾或另一不同的參數組的開始。在連接到服務器時,用指定的主機名、用戶名和口令替換serverhost、yourname 和yourpass。對於筆者來說,.my.cnf 如下所示:
只有[clIEnt] 行是必須的。定義參數值的行都是可選的;可以僅指定那些所需要的參數。例如,如果您的MySQL用戶名與UNIX 的登錄名相同,則不需要包括user 行。在創建了.my.cnf 文件後,設置其訪問方式為某個限定值以保證別人不能讀取它:
在Windows 下,選項文件的內容是相同的,但其名稱不同( c:my.cnf),而且不調用chmod 命令。因為選項文件在版本3.22 前未加到MySQL,所以更早的版本不能使用它們。特別是在Windows 下,您不能與共享MySQL分發包一起得到的客戶機使用選項文件,因為它是基於MySQL3.21的。選項文件在注冊過的MySQL的Windows 版本下工作得很好,否則可以從MySQLWeb 站點取得更新的支持選項文件的客戶機。關於選項文件的詳細內容可參閱附錄E“MySQL程序參考”。
2. 利用外殼程序的命令歷史諸如c s h、tcsh 和bash 這樣的外殼程序會在一個歷史列表中記下您的命令,並允許重復該列表中的命令。如果采用的是這樣的外殼程序,其歷史列表可幫助免除完整命令的鍵入。例如,如果最近調用了MySQL,可按如下命令再次執行它:% !my 其中“!”告訴外殼程序搜索整個命令歷史找到最近以“ my”開頭的命令,並像您打入的一樣發布它。有的外殼程序還允許利用上箭頭和下箭頭鍵(或許是Ctrl-P 和Ctrl - N)在歷史列表中上下移動。可用這種方法選擇想要的命令,然後按Enter 執行它。tcsh 和bash 有這種功能,而其他外殼程序也可能有。可參閱相應的外殼程序以找到更多使用歷史列表的內容。
3. 利用外殼程序的別名或腳本如果使用的外殼程序提供別名功能,那麼可以設置允許通過鍵入簡短名調用長命令的命令快捷鍵。例如,在csh 或tcsh 中,可利用alias 命令設置名為samp_db 的別名,如下所示:
而bash 中的語法稍有不同:
可以定義一個別名使這兩個命令等價:
顯然,第一個比第二個更好鍵入。為了使這些別名在每次登錄時都起作用,可將在外殼程序設置文件中放入一個alias 命令(如,csh 放入.cshrc,而bash 放入.bash_profile)。快捷鍵的其他形式是建立利用適當的選項執行MySQL的外殼程序腳本。在UNIX 中,等價於samp_db 別名的腳本文件如下所示:
如果筆者命名此腳本為samp_db 並使其可執行(用chmod +x samp_db),那麼可以鍵入samp_db 運行MySQL並連接到筆者的數據庫中。在Windows 下,可用批命令文件來完成相同的工作。命名文件samp_db.bat,並在其中放入如下的行:
此批命令文件可通過在DOS 控制台提示符下鍵入samp_db 來執行,也可以雙擊它的Windows 圖標來執行。如果訪問多個數據庫或連接到多個主機,則可以定義幾個別名或腳本,每一個都用不同的選項調用MySQL。
1.5.2 以較少的鍵入發布查詢
MySQL是一個與數據庫進行交互的極為有用的程序,但是其界面最適合於簡短的、單行的查詢。當然, MySQL自身並不關心某個查詢是否分成多行,但是長的查詢很不好鍵入。輸入一條查詢也不是很有趣的事,即使是一條較短的查詢也是如此,除非發現有錯誤才願意重新鍵入它。
有幾種可用來避免不必要的鍵入或重新鍵入的技巧:
■ 利用MySQL的輸入行編輯功能。
■ 利用拷貝和粘貼。
■ 以批方式運行MySQL。
■ 利用現有數據來創建新記錄以避免鍵入INSERT 語句。
1. 利用MySQL的輸入行編輯器
MySQL具有內建的GNU Readline 庫,允許對輸入行進行編輯。可以對當前錄入的行進行處理,或調出以前輸入的行並重新執行它們(原樣執行或做進一步的修改後執行)。在錄入一行並發現錯誤時,這是非常方便的;您可以在按Enter 鍵前,在行內退格並進行修正。如果錄入了一個有錯的查詢,那麼可以調用該查詢並對其進行編輯以解決問題,然後再重新提交它。(如果您在一行上鍵入了整個查詢,這是最容易的方法。)表1-4 中列出了一些非常有用的編輯序列,除了此表中給出的以外,還有許多輸入編輯命令。利用因特網搜索引擎,應該能夠找到R e a d l i n e手冊的聯機版本。此手冊也包含在Readline 分發包中,可在http://www.gnu.org/ 的GN U Web 站點得到。
下面的例子描述了輸入編輯的一個簡單的使用。假定用MySQL輸入了下列查詢:
如果在按Enter 前,已經注意到將“ p r e s i d e n t”錯拼成了“ per s i d e n t”,則可按左箭頭或Ctrl-B多次移動光標到“s”的左邊。然後按Delete 兩次刪除“er”,鍵入“r e”改正錯誤,並按Enter 發布此查詢。如果沒注意到錯拼就按了E n ter,也不會有問題。在MySQL顯示了錯誤消息後,按上箭頭或Ctrl-P 調出該行,然後對其進行編輯。
輸入行編輯在mysql的Windows 版中不起作用,但是可從MySQLWeb 站點取得免費的cygwin_32 客戶機分發包。在該分發包中的mysqlc 程序與MySQL一樣,但它支持輸入行編輯命令。
2. 利用拷貝和粘貼發布查詢
如果是在窗口環境下工作,可將認為有用的查詢文本保存在一個文件中並利用拷貝和粘貼操作很容易地發布這些命令。其工作過程如下:
1) 在Te l n e t窗口或DOS 控制窗口中激活MySQL。
2) 在一個文檔窗口打開包含查詢的文件。(如筆者在Mac OS 下使用B B E d i t,在UNIX中使用X Window System 下的xterm 窗口中的v i。)
3) 為了執行存放在文件中的某個查詢,選擇並拷貝它。然後切換到Telnet 窗口或DOS 控制台,並將該查詢粘貼到mysql。這個過程寫起來似乎有點令人討厭,但它是一個快速錄入查詢的很容易的方法,實際使用時不用鍵入查詢。這個方法也允許在文檔窗口中對查詢進行編輯,而且它允許拷貝和粘貼現有查詢來構造一個新的查詢。例如,如果您經常從某個特定的表中選擇行,但是喜歡查看以不同方式存放的輸出結果,則可以在文檔窗口中保存一個不同的ORDER BY 子句的列表,然後為任意的特定查詢拷貝和粘貼想使用的那個子句。也可按其他方向拷貝和粘貼(從Telnet 到查詢文件)。在mysql中錄入行時,它們被保存在您的主目錄中的名為.mysql_history 的文件中。如果您手工錄入了一個希望保存起來今後使用的查詢,可退出mysql,在某個編輯器中打開. mysql_ h i s t o r y,然後從.MySQL_history 拷貝和粘貼此查詢到您的查詢文件。
3. 以批方式運行mysql不一定必須交互式地運行mysql。mysql能夠以非交互式(批)方式從某個文件中讀取輸入。這對於定期運行的查詢是很有用的,因為您一定不希望每次運行此查詢時都要重新鍵入它。只要一次性地將其放入一個文件,然後讓mysql在需要時執行該文件的內容即可。假定有一個查詢查找member 表的interests 列,以找出那些對美國歷史的某個方面感興趣的歷史同盟會員。如查找對大蕭條期有興趣的會員,可編寫此查詢如下(注意結尾處有一個分號,從而MySQL能夠知道查詢語句在何處結束):
為了使用此查詢來找出對Thomas Jefferson 感興趣的會員,可以編輯此查詢文件將depression 更改為Je fferson 並再次運行MySQL。只要不很經常使用此查詢,它工作得很好。如果經常使用,則需要更好的方法。使用此查詢更為靈活的一種方法是將其放入一個外殼程序腳本中,此腳本從腳本命令行取一個參數並利用它來更改查詢的文本。這樣確定查詢的參數,使得能夠在運行腳本時指定令人感興趣的關鍵字。為了了解這如何起作用,按如下編寫一個較小的外殼程序腳本i n ter e s t s . s h:
其中第二行保證在命令行上有一個關鍵字;它顯示一條簡短的消息,或者退出。在< < Q U E RY_INPUT 和最後的Q U E RY_INPUT 之間的所有內容成為MySQL的輸入。在查詢文本中,外殼程序用來自命令行的關鍵字替換$ 1。(在外殼程序腳本中, $ 1、$ 2 . . .為命令參數。)這使相應的查詢反映了執行此腳本時在命令行上指定的關鍵字。在能夠運行此腳本前,必須使其可執行:
現在不需要在每次運行腳本時對其進行編輯了。只要在命令行上告訴它需要查找什麼就行了。如下所示:
4. 利用現有數據來創建新記錄
可以用INSERT 語句每次一行地將新記錄追加到表中,但是在通過手工鍵入INSERT 語句建立幾個新記錄後,多數人都會意識到應該有更好的追加記錄的方法。一種選擇是利用僅含有數據值的文件,然後利用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 的行結束符。(UNIX利用換行符、Mac OS 利用回車換行符、Windows 利用回車換行符/換行符對作為行結束符。)可告訴LOAD DATA 或MySQLimport 尋找什麼換行符,但是在UNIX 下,對含換行符的文件處理要更容易一些。
在轉換了文件之後,應該檢查一下在結尾處是否具空白行。如果有,應該將它們刪除,否則在將該文件裝載到數據庫時,這些空白行將會轉換為空白或畸形的記錄。來自電子表格以無格式文本保存的文件,或具有能括住包含空格的值的括號。為了在將該文件裝入數據庫時去掉這些括號,可利用LOAD DATA 的FIELDS ENCLOSEDBY 子句,或利用MySQLimport 的--fIElds - enclosed - by 選項。更詳細的信息請參看附錄D 中LOAD DATA 的相應項。
1.6 向何處去
現在我們已經介紹了許多使用MySQL的知識。您已經知道了怎樣設置數據庫並創建表。能夠將記錄放入這些表中,並以各種方式對其進行檢索,更改或刪除。但是要掌握MySQL仍然有許多知識要學,本章中的教程僅僅給出了一些淺顯的東西。通過考察我們的樣例數據庫就會明白這一點。我們創建了樣例數據庫及其表,並用一些初始的數據對其進行了填充。在這個工作過程中,我們明白了怎樣編寫查詢,回答關於數據庫中信息的某些問題,但是還有許多工作要做。
例如,我們沒有方便的交互方式來輸入學分保存方案的新學分記錄,或輸入歷史同盟地址名錄的會員條目。還沒有方便的方法來編輯現有記錄,而且我們仍然不能生成印刷或聯機形式的同盟地址名錄。這些任務以及一些其他的任務將在以後的各章中陸續地進行介紹,特別是在第7章“Perl DBI API”和第8 章“PHP API”中將要進行詳細地介紹。
下一步將閱讀本書中哪部分取決於您對什麼內容感興趣。如果希望了解怎樣完成已經以
歷史同盟和學分保存方案開始的工作,可看第一部分有關MySQL程序設計的內容。如果打算成為某個站點的MySQL管理員,本書的第三部分將對管理工作做較多的介紹。但是,筆者建議通過閱讀第一部分中的其余各章,首先獲得使用MySQL的一般背景知識。
這些章節討論了MySQL怎樣處理數據,進一步提供有關語法和查詢語句的用途,並且說明了怎樣使查詢運行得更快。不管您在什麼環境中使用MySQL,不管是運行MySQL還是編寫自己的程序,
還是作為數據庫管理員,用這些內容打下一個良好的基礎將有助於您站在一個較高的起點上。