在PHP中應用程式資料庫時,通常是先在MySQL客戶機的控制台中,使用DDL語句建立網站中的資料庫、資料表及修改表結構等操作以後,再在PHP指令碼中應用。很少直接在PHP中執行DDL語句動態建立資料庫、資料表或修改表的操作,通常也只有在製作安裝版本的網站時才會這麼做。
1.建立表(CREATE TABLE)
資料庫建立以後,使用use命令選定這個新建立的資料庫作為預設(當前)資料庫使用,就可以繼續建立其包含的資料表。資料表的建立是使用表的前提,建立資料表主要是定義資料表的結構,包括資料表的名稱、欄位名、欄位類型、約束及其索引等。其基本文法如下所示:
| 代碼如下 |
複製代碼 |
CREATE TABLE [IF NOT EXISTS] 表名稱( #建立帶給定名稱的表,必須擁有表CREATE許可權 欄位名1 列類型 [屬性] [索引], #聲明表中第一個欄位,必須有欄位名和列類型 欄位名2 列類型 [屬性] [索引], ... 欄位名n 列類型 [屬性] [索引] #每個欄位的屬性和索引都是可選的,根據需要設定 )[表類型] [表字元集]; #在建立表時也可以指定可選的表類型和字元集的設定
|
其中“[]”中為可選的內容,一個表可以由一個或多個欄位(列)組成,在欄位後面一定要註明欄位的資料類型。每一個欄位也可以使用屬性對其進行限制說明,但屬性是可選的,根據表的需要進行聲明,如前面介紹的AUTO_INCREMENT、NOT NULL、DEFAULT屬性等。還可以通過PRIMARYKEY、UNIQUE、INDEX和KEY子句為每個欄位定義索引。索引可以跟在每個欄位後面聲明,也可以在欄位聲明之後使用從句的方式聲明。如果有多個列,用逗號將它們分隔。例如建立一個用於儲存使用者資訊users,該表的具體設計如下圖所示。
在建立表users時,除了需要指定各個欄位的屬性和索引外,還需要指定預設的表類型為MyISAM,以及指定預設建立表字元集(character set)為utf8,校隊規則(collation)是utf8_general_ci。在MySQL控制台中輸入以下語句建立資料表users。
| 代碼如下 |
複製代碼 |
CREATE TABLE IF NOT EXISTS users( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, username VARCHAR(50) NOT NULL, userpass VARCHAR(50) NOT NULL, telno VARCHAR(20) NOT NULL UNIQUE, sex ENUM('男','女') NOT NULL DEFAULT '男', brithday DATE NOT NULL DEFAULT '0000-00-00', PRIMARY KEY(ID), INDEX users_username(username,userpass) )ENGINE=MyISAM DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
|
資料表成功建立後,可以在MySQL控制台中使用“SHOW TABLES”命令查看。還可以在MySQL控制台中,使用“describe表名”或“desc表名”命令用於顯示表的建立結構,如下所示。
預設的情況是,表被建立到當前的資料庫中。如果表已存在,或者如果沒有當前資料庫,或者如果資料庫不存在,則會出錯。表名稱也可以被指定為“資料庫名.表名”,以便在特定的資料庫中建立表。不論是否有當前資料庫,都可以通過這種方式建立表。如果使用加引號的識別名,則應對資料庫和表名稱分別加引號。例如,‘mydb’.‘mytbl’是合法的,但是‘mydb.mybl’不合法。如果表已存在則使用關鍵詞if not exists可以防止發生錯誤。
2.修改表(ALTER TABLE)
修改表是指修改表的結構,在實際應用中,當發現某個表的結構不滿足要求時,可以用ALTER TABLE語句來修改表的結構,包括添加新的欄位、刪除原有的欄位、修改列的類型、屬性及索引,甚至可以修改表的名稱等。修改表的文法如下所示:
ALTER TABLE 表名 ACTION;#修改表的文法格式
其中ACTION是ALTER TABLE的從句,包括為指定的表添加一新列、為表添加一個索引、更改指定預設值、更改列類型、刪除一列、刪除索引、更改表名等語句。下面將簡單介紹幾種常用的方式。
★為指定的資料表添加一新欄位,可以在ACTION從句中使用ADD關鍵字實現,文法格式如下所示:
ALTER TABLE 表名 ADD 欄位名 <建表語句> [FIRST|AFTER 列名] #為指定的表添加新列
如果沒有指定可選的FIRST或AFTER,則在列尾添加一列,否則在指定列添加新列。例如,為上面建立的使用者表users列尾添加一個E-mail欄位,則在MySQL控制台中輸入的命令如下所示:
mysql>ALTER TABLE users ADD email VARCHAR(30) NOT NULL;
如果需要為使用者表users,在第一列前面添加一個真實姓名(name)的新列,列類型為字串,屬性設定為非空。並在原有的欄位userpass之後添加一個身高(height)的新列,列類型為DOUBLE,屬性為非空並設定預設值為0.00,。則在MySQL控制台中輸入的命令如下所示:
| 代碼如下 |
複製代碼 |
mysql>ALTER TABLE users ADD name VARCHAR(30) NOT NULL FIRST; mysql>ALTER TABLE users ADD height DOUBLE NOT NULL DEFAULT ’0.00′ AFTER userpass; |
★為指定的資料表為了更改原有欄位的類型,可以使用CHANGE或MODIFY子句。如果原列的名字和新列的名字相同,則change和Modify的作用相同。文法格式如下所示:
ALTER TABLE 表名 CHANGE(MODIFY) 列表 <建表語句> #為指定的表修改列類型
如果需要修改使用者表users中的電話號碼欄位telNo,將列類型VARCHAR(20)改為數實值型別INT,並將預設值設定為0.則可以在MySQL控制台中共輸入的命令如下所示:
| 代碼如下 |
複製代碼 |
mysql>ALTER TABLE users MODIFY telno INT UNSIGHED DEFAULT ’0′; mysql>ALTER TEBLE users CHANGE telno telno INT UNSIGNED DEFAULT ’0′; |
在CHANGE命令中的列名telno出現了兩次,原因是CHANGE除了更改類型外還能更改列名,在MODIFY不能實現這個功能。如果希望在更改類型的同時重新將telno命名為phone,可按如下命令進行操作。
mysql>ALTER TABLE users CHANGE telno phone INT UNSIGNED DEFAULT ’0′;
使用CHANGE更改了列的定義,並說明了一個包括列名的完整定義,即使不更改列名,也需要在定義中包括相應的列名。
★如果需要為指定的資料表重新命名,可使用RENAME AS 子句,給出舊錶名和新表名即可。文法格式如下所示:
ALTER TABLE 舊錶名 RENAME AS 新表名 #為指定的資料表重新命名
3.刪除表(DROP TABLE)
當某個資料表不再需要時,可以使用SQL的DROP TABLE語句刪除。刪除表要比建立和修改表要容易的多,只需指定表名即可。其文法如下所示:
DROP TABLE [IF EXISTS] 表名#刪除不再使用的資料表
當不能確定資料表是否存在,如果存在就刪除它,不存在則刪除時也不希望出現錯誤,就可在DROPTABLE語句中增加IF EXISTS。同CREATE TABLE一樣,IF EXISTS語句在含有DROP TABLE 的SQL指令碼中很常用,如果不存在待刪除的表,則指令碼會繼續向下執行而不會拋出錯誤。