在PHP中應用數據庫時,通常是先在MySQL客戶機的控制台中,使用DDL語句創建網站中的數據庫、數據表及修改表結構等操作以後,再在PHP腳本中應用。很少直接在PHP中執行DDL語句動態創建數據庫、數據表或修改表的操作,通常也只有在制作安裝版本的網站時才會這麼做。
1.創建表(CREATE TABLE)
數據庫創建以後,使用use命令選定這個新創建的數據庫作為默認(當前)數據庫使用,就可以繼續建立其包含的數據表。數據表的創建是使用表的前提,創建數據表主要是定義數據表的結構,包括數據表的名稱、字段名、字段類型、約束及其索引等。其基本語法如下所示:
其中“[]”中為可選的內容,一個表可以由一個或多個字段(列)組成,在字段後面一定要注明字段的數據類型。每一個字段也可以使用屬性對其進行限制說明,但屬性是可選的,根據表的需要進行聲明,如前面介紹的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腳本中很常用,如果不存在待刪除的表,則腳本會繼續向下執行而不會拋出錯誤。