3.4 創建、刪除、索引和更改表
可利用CREATE TABLE、DROP TABLE 和ALTER TABLE 語句創建表,然後,對它們進行刪除,更改它們的結構。對於它們中的每一條語句,存在MySQL專有的擴充,這些擴充使各語句更為有用。CREATE INDEX 和DROP INDEX 語句使您能夠增加或刪除現有表上
的索引。
3.4.1CREATE TABLE 語句
用CREATE TABLE 語句創建表。此語句的完整語法是相當復雜的,因為存在那麼多的可選子句,但在實際中此語句的應用相當簡單。如我們在第1章中使用的所有CREATE TABLE 語句都不那麼復雜。有意思的是,大多數復雜東西都是一些子句,這些子句MySQL在分析後扔掉。參閱附錄D 可看到這些復雜的東西。看看CREATE TABLE 語句的各項條款,注意該語句有多少語法是用於REFERENCES CONSTRAINT 和CHECK 子句的。這些子句涉及外部鍵、引用完整性及輸入值約束。MySQL不支持這些功能,但它分析其語法使其更容易利用在其他數據庫系統中建立的表定義。(可以用較少的編輯工作更容易地利用該代碼。)如果您從頭開始編寫自己的表描述,可以完全不管這些子句。本節中我們對它們也不多做介紹。CREATE TABLE 至少應該指出表名和表中列的清單。例如:
除構成表的列以外,在創建表時還可以說明它應該怎樣索引。另一個選擇是創建表時不進行索引,以後再增加索引。如果計劃在開始將表用於查詢前,用大量的數據填充此表,以後再創建索引是一個好辦法。在插入每一行時更新索引較裝載數據到一個未索引的表中然後
再創建索引要慢得多。我們已經在第1章中介紹了CREATE TABLE 語句的基本語法,並在第2章討論了怎樣描述列類型。這裡假定您已經讀過了這兩章,因此我們就不重復這些內容了。在本節下面,我們將介紹一些MySQL3.23 中對CREATE TABLE 語句的重要擴充,這些擴充在構造表方面提供了很大的靈活性,這些擴充為:
■ 表存儲類型說明符。
■ 僅當表不存在時才進行創建。
■ 在客戶機會話結束時自動刪除臨時表。
■ 通過選擇希望表存儲的數據來創建一個表。
1. 表存儲類型說明符
在MySQL3.23 之前,所有用戶創建的表都利用的是ISAM 存儲方法。在MySQL3.23中,可在CREATE TABLE 語句的列的列表之後指定TYPE = type,以三種類型明確地創建表。其中type 可以為MYISAM、ISAM 或HEAP。例如:
將表轉換為HEAP 類型可能不是一個好主意,但是,如果希望表一直維持到服務器關閉,可以進行這個轉換。HEAP 表在服務器退出之前,一直保留在內存中。這三種表類型的一般特點如下:
■ MyISAM 表。MyISAM 存儲格式自版本3.23 以來是MySQL中的缺省類型,它有下列特點:
■ 如果操作系統自身允許更大的文件,那麼文件比ISAM 存儲方法的大。
■ 數據以低字節優先的機器獨立格式存儲。這表示可將表從一種機器拷貝到另一種機器,即使它們的體系結構不同也可以拷貝。
■ 數值索引值占的存儲空間較少,因為它們是按高字節優先存儲的。索引值在低位字節中變化很快,因此高位字節更容易比較。
■ AUTO_INCREMENT 處理比ISAM 的表更好。詳細內容在第2章討論。
■ 減少了幾個索引限制。例如,可對含NULL 值的列進行索引,還可以對BLOB 和TEXT 類型的列進行索引。
■ 為了改善表的完整性檢查,每個表都具有一個標志,在myisamchk 對表進行過檢查後,設置該標志。可利用myisamchk - fast 跳過對自前次檢查以來尚未被修改過表的檢查,這樣使此管理任務更快。表中還有一個指示表是否正常關閉的標志。如果服務器關閉不正常,或機器崩潰,此標志可用來檢測出服務器起動時需要檢查的表。
■ ISAM 表。ISAM 存儲格式是MySQL3.23 所用的最舊的格式,但當前仍然可用。通常,相對於ISAM 表來說,寧可使用MyISAM 表,因為它們的限制較少。對ISAM 表的支持隨著此存儲格式被MyISAM 表格式所支持很有可能會逐漸消失。
■ HEAP 表。HEAP 存儲格式建立利用定長行的內存中的表,這使表運行得非常快。在服務器停止時,它們將會消失。在這種意義上,這些表是臨時的。但是,與用CREATE TEMPORARY TABLE 所創建的臨時表相比,HEAP 表是其他客戶機可見的。HEAP 表有幾個限制,這些限制對MyISAM 或ISAM 表沒有,如下所示: