MySQL在創建表的時候,創建一個.frm文件保存表和列定義。索引存儲在一個有.MYI(MYindex)擴展名的文件並且數據存儲在有.MYD(MYData)擴展名的文件中。
一、用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}
SHOW TABLES列出在一個給定的數據庫中的表。你也可以用mysqlshow db_name命令得到這張表。當然使用mysqlshow時,需要接參數-u 用戶名 -p xx;
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實用程序的用法,在得到數據庫和表的信息上,使用起來非常方便。當然使用mysqlshow時,需要接參數-u 用戶名 -p xx;
得到已有數據庫的列表:
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 語句創建數據表
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語句即可。
4、利用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 子句,例如:
但創建空表時有幾點要注意。在創建一個通過選擇數據填充的表時,其列名來自所選擇的列名。如果某個列作為表達式的結果計算,則該列的“名稱”為表達式的文本。表達式
不是合法的列名,可在mysql 中運行下列查詢了解這一點:
為了正常工作,可為該列提供一個合法的別稱:
如果選擇了來自不同表的具有相同名稱的列,將會出現一定的困難。假定表t1 和t2 兩者都具有列c,而您希望創建一個來自兩個表中行的所有組合的表。那麼可以提供別
名指 定新表中惟一性的列名,如:
通過選擇數據進行填充來創建一個表並會自動拷貝原表的索引。
五、用ALTER TABLE語句修改表的結構
有時你可能需要改變一下現有表的結構,那麼Alter Table語句將是你的合適選擇。
增加列
alter table tbl_name add col_name type
例如,給表增加一列weight
mysql>alter table pet add weight int;
刪除列
alter table tbl_name drop col_name
例如,刪除列weight:
mysql>alter table pet drop weight;
改變列
alter table tbl_name modify col_name type
例如,改變weight的類型:
mysql> alter table pet modify weight samllint;
另一種方法是:
alter table tbl_name change old_col_name col_name type
例如:
mysql> alter table pet change weight weight samllint;
給列更名
mysql>alter table pet change weight wei;
給表更名
mysql>alter table tbl_name rename new_tbl
例如,把pet表更名為animal
mysql>alter table pet rename animal;
六、用DROP TABLE 語句刪除數據表
DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...]
DROP TABLE刪除一個或多個數據庫表。所有表中的數據和表定義均被刪除,故小心使用這個命令!
在MySQL 3.22或以後版本,你可以使用關鍵詞IF EXISTS類避免不存在表的一個錯誤發生。
例如:
mysql>USE mytest;
mysql>DROP TABLE guestbook;
或者,也可以同時指定數據庫和表:
mysql>DROP TABLE mytest.guestbook;