摘要:本文講解了MySQL數據庫中表的操作方法。通過本文的學習您應該掌握如何在MySQL中創建表、刪除表,如何改變表的結構、名字,如何使用mysqlshow實用程序等。
使用MySQL,目前你可以在三種基本數據庫表格式間選擇。當你創建一張表時,你可以告訴MySQL它應該對於表使用哪個表類型。MySQL將總是創建一個.frm文件保存表和列定義。視表類型而定,索引和數據將在其他文件中存儲。
你能用ALTER TABLE語句在不同類型的表之間變換。
MyISAM
在MySQL 3.23中,MyISAM是缺省表格類型,它是基於ISAM代碼並且有很多有用的擴展。索引存儲在一個有.MYI(MYindex)擴展名的文件並且數據存儲在有.MYD(MYData)擴展名的文件中。你能用myisamchk實用程序檢查/修復MyISAM表。
ISAM
你也可以使用放棄的ISAM。這將在不久消失,因為MyISAM是同一個東西的更好實現。ISAM使用一個B-tree索引,這個索引存儲在一個有.ISM擴展名的文件中並且數據存儲在有.ISD擴展名的文件中,你可用isamchk實用程序檢查/修復ISAM表。ISAM表不是跨OS/平台二進制可移植的。
HEAP
HEAP表格使用一個雜湊(hashed)索引並且存儲在內存中。這使他們更快,但是如果MySQL崩潰,你將失去所有存儲的數據。HEAP作為臨時表很可用!
用SHOW/ DESCRIBE語句顯示數據表的信息
句法:
SHOW TABLES [FROM db_name] [LIKE wild]
or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild]
or SHOW INDEX FROM tbl_name [FROM db_name]
or SHOW TABLE STATUS [FROM db_name] [LIKE wild]
{DESCRIBE | DESC} tbl_name {col_name | wild}
你能使用db_name.tbl_name作為tbl_name FROM db_name句法的另一種選擇。
SHOW TABLES列出在一個給定的數據庫中的表。你也可以用mysqlshow db_name命令得到這張表。
注意:如果一個用戶沒有一個表的任何權限,表將不在SHOW TABLES或mysqlshow db_name中的輸出中顯示。
SHOW COLUMNS列出在一個給定表中的列。如果列類型不同於你期望的是基於CREATE TABLE語句的那樣,注意,MySQL有時改變列類型。
DESCRIBE語句提供了類似SHOW COLUMNS的信息。DESCRIBE提供關於一張表的列的信息。col_name可以是一個列名字或包含SQL的“%”和“_”通配符的一個字符串。這個語句為了與 Oracle 兼容而提供的。
SHOW TABLE STATUS(在版本3.23引入)運行類似SHOW STATUS,但是提供每個表的更多信息。你也可以使用mysqlshow --status db_name命令得到這張表。
SHOW FIELDS是SHOW COLUMNS一個同義詞,SHOW KEYS是SHOW INDEX一個同義詞。
你也可以用mysqlshow db_name tbl_name或mysqlshow -k db_name tbl_name 列出一張表的列或索引。
SHOW INDEX以非常相似於ODBC的SQLStatistics調用的格式返回索引信息。
使用mysqlshow 工具得到信息
下面簡單介紹一下mysqlshow實用程序的用法,在得到數據庫和表的信息上,使用起來非常方便。
得到已有數據庫的列表:
shell> mysqlshow
列出某數據庫db_name中已有的表:
shell> mysqlshow db_name
列出某數據庫表db_name.tbl_name的結構信息:
shell>mysqlshow db_name tbl_name
列出一張表的索引:
shell> mysqlshow –k db_name tbl_name
用CREATE TABLE 語句創建數據表
用 CREATE TABLE 語句創建表。此語句的完整語法是相當復雜的,因為存在那麼多的可選子句,但在實際中此語句的應用相當簡單。如我們在第 1 章中使用的所有 CREATE TABLE 語句都不那麼復雜。
有意思的是,大多數復雜東西都是一些子句,這些子句MySQL在分析後扔掉。參閱附錄 1 可以看到這些復雜的東西。
1、CREATE TABLE 語句的基本語法
CREATE TABLE tbl_name(create_definition,...) [TYPE =table_type]
create_definition: col_name type [NOT NULL | NULL]
[DEFAULT default_value] [AUTO_INCREMENT][PRIMARY KEY]
在MySQL3.22或以後版本中,表名可以被指定為db_name.tbl_name,不管有沒有當前的數據庫都可以。
例如,創建一個訪問者留言表:
shell> mysql –u root –p
mysql> create database mytest;
mysql> CREATE TABLE guestbook
-> (
-> visitor VARCHAR(40),
-> comments TEXT,
-> entrydate DATETIME
->);
如果一切正常,祝賀你,你已經建立了你的第一個表!
你所創建的表名為guestbook,你可以使用這個表來存儲來字你站點訪問者的信息。你是用REEATE TABLE語句創建的這個表,這個語句有兩部分:第一部份指定表的名子;第二部份是括在括號中的各字段的名稱和屬性,相互之間用逗號隔開。
表guestbook有三個字段:visitor,comments 和entrydate。visitor字段存儲訪問者的名字,comments字段存儲訪問者對你站點的意見,entrydate字段存儲訪問者訪問你站點的日期和時間。
注意每個字段名後面都跟有一個專門的表達式。例如,字段名comments後面跟有表達式TEXT。這個表達式指定了字段的數據類型。數據類型決定了一個字段可以存儲什麼樣的數據。因為字段comments包含文本信息,其數據類型定義為文本型。
2、如何指定表的類型
你也可以在創建表時指定表的類型,如果不指定表的類型,在3.22及以前版本中缺省為ISAM表,在3.23版本中缺省為MyISAM表。你應該盡量使用MyISAM表。指定表的類型經常用於創建一個HEAP表:
mysql> CREATE TABLE fast(id int,articles TEXT) TYPE=HEAP;
3、隱含的列說明的改變
在某些情況下,MySQL隱含地改變在一個CREATE TABLE語句給出的一個列說明。(這也可能在ALTER TABLE。)長度小於4的VARCHAR被改變為CHAR。如果在一個表中的任何列有可變長度,結果是整個行是變長的。因此, 如果一張表包含任何變長的列(VARCHAR、TEXT或BLOB),所有大於3個字符的CHAR列被改變為VARCHAR列。這在任何方面都不影響你如何使用列;在MySQL中,VARCHAR只是存儲字符的一個不同方法。MySQL實施這種改變,是因為它節省空間並且使表操作更快捷。
TIMESTAMP的顯示尺寸必須是偶數且在2 ~ 14的范圍內。如果你指定0顯示尺寸或比14大,尺寸被強制為14。從1~13范圍內的奇數值尺寸被強制為下一個更大的偶數。
你不能在一個TIMESTAMP列裡面存儲一個文字NULL;將它設為NULL將設置為當前的日期和時間。因為TIMESTAMP列表現就是這樣,NULL和NOT NULL屬性不以一般的方式運用並且如果你指定他們,將被忽略。DESCRIBE tbl_name總是報告該TIMESTAMP列可能賦予了NULL值。
如果你想要知道MySQL是否使用了除你指定的以外的一種列類型,在創建或改變你的表之後,發出一個DESCRIBE tbl_name語句即可。
利用 SELECT 的結果創建表
關系數據庫的一個重要概念是,任何數據都表示為行和列組成的表,而每條 SELECT 語句的結果也都是一個行和列組成的表。在許多情況下,來自 SELECT 的“表”僅是一個隨著您的工作在顯示屏上滾動的行和列的圖像。在 MySQL 3.23 以前,如果想將 SELECT 的結果保存在一個表中以便以後的查詢使用,必須進行特殊的安排:
1) 運行 DESCRIBE 或 SHOW COLUMNS 查詢以確定想從中獲取信息的表中的列類型。
2) 創建一個表,明確地指定剛才查看到的列的名稱和類型。
3) 在創建了該表後,發布一條 INSERT ... SELECT 查詢,檢索出結果並將它們插入所創建的表中。
在 MySQL 3.23 中,全都作了改動。CREATE TABLE ... SELECT 語句消除了這些浪費時間的東西,使得能利用 SELECT 查詢的結果直接得出一個新表。只需一步就可以完成任務,不必知道或指定所檢索的列的數據類型。這使得很容易創建一個完全用所喜歡的數據填充的表,並且為進一步查詢作了准備。
如果你在CREATE語句後指定一個SELECT,MySQL將為在SELECT中所有的單元創鍵新字段。例如:
mysql> CREATE TABLE test
-> (a int not null auto_increment,primary key (a), key(b))
-> SELECT b,c from test2;
這將創建一個有3個列(a,b,c)的表,其中b,c列的數據來自表test2。注意如果在拷貝數據進表時發生任何錯誤,表將自動被刪除。
可以通過選擇一個表的全部內容(無 WHERE 子句)來拷貝一個表,或利用一個總是失敗的 WHERE 子句來創建一個空表,如:
mysql> CREATE TABLE test SELECT * from test2;
mysql> CREATE TABLE test SELECT * from test2 where 0;
如果希望利用 LOAD DATA 將一個數據文件裝入原來的文件中,而不敢肯定是否具有指定的正確數據格式時,創建空拷貝很有用。您並不希望在第一次未得到正確的選項時以原來表中畸形的記錄而告終。利用原表的空拷貝允許對特定的列和行分隔符用 LOAD DATA 的選項進行試驗,直到對輸入數據的解釋滿意時為止。在滿意之後,就可以將數據裝入原表了。
可結合使用 CREATE TEMPORARY TABLE 與 SELECT 來創建一個臨時表作為它自身的拷貝,如:
這允許修改 my_tbl 的內容而不影響原來的內容。在希望試驗對某些修改表內容的查詢,而又不想更改原表內容時,這樣做很有用。為了使用利用原表名的預先編寫的腳本,不需要為引用不同的表而編輯這些腳本;只需在腳本的起始處增加 CREATE TEMPORARY TABLE 語句即可。相應的腳本將創建一個臨時拷貝,並對此拷貝進行操作,當腳本結束時服務器會自動刪除這個拷貝。
要創建一個作為自身的空拷貝的表,可以與 CREATE TEMPORARY ... SELECT 一起使用 WHERE 0 子句,例如:
但創建空