利用 MySQL 的 ALTER 命令可以很方便地修改表名與表字段名,以及添加或刪除表中已有的列。
為了實(shí)踐 ALTER 命令,下面先來創(chuàng)建一個(gè)名為 testalter_tbl 的表。
root@host# mysql -u root -p password;
Enter password:*******
mysql> use TUTORIALS;
Database changed
mysql> create table testalter_tbl
-> (
-> i INT,
-> c CHAR(1)
-> );
Query OK, 0 rows affected (0.05 sec)
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| i | int(11) | YES | | NULL | |
| c | char(1) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
假如要從上面我們創(chuàng)建的這張表中刪除 i 這一列,那么應(yīng)該使用 DROP 子句和 ALTER 命令,如下所示:
mysql> ALTER TABLE testalter_tbl DROP i;
如果表中只有一列,則 DROP 子句不起作用。
添加一列,使用 ADD 并指定列定義。下面我們?cè)侔?i 這一列恢復(fù)到 testalter_tbl 中。
mysql> ALTER TABLE testalter_tbl ADD i INT;
輸入該語句之后,這張表將跟之前創(chuàng)建時(shí)一樣,含有2列。但結(jié)構(gòu)卻稍有差異。默認(rèn)情況下,新增加的列位于表的末尾。在創(chuàng)建表時(shí),i 是第一列,現(xiàn)在卻成為最后一列。
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
要想把列放到一個(gè)特定位置,可以使用兩種方法。第一種方法是使用 FIRST,讓指定列成為第一列;第二種則采用 AFTER 后跟給定列名的方式,指示新列應(yīng)該放到給定列名的后面。下面分別利用 ALTER TABLE 語句對(duì)列進(jìn)行操作,每執(zhí)行完一行后,我們可以使用 SHOW COLUMNS 來查看一下各自的效果。
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl DROP i;
ALTER TABLE testalter_tbl ADD i INT AFTER c;
標(biāo)識(shí)符 FIRST 和 AFTER 只能和 ADD 子句一起使用。這也意味著,如果要重新定位一列,就必須先用 DROP 刪除它,然后再用 ADD 將它添加到新的位置。
要想改變列的定義,需要使用 MODIFY 或 CHANGE 子句,并配合使用 ALTER 命令。例如,把列 c 從 CHAR(1) 變?yōu)?CHAR(10):
mysql> ALTER TABLE testalter_tbl MODIFY c CHAR(10);
CHANGE 的語法稍有不同。必須把所要改變的列名放到 CHANGE 關(guān)鍵字的后面,然后指定新的列定義。相關(guān)范例如下所示:
mysql> ALTER TABLE testalter_tbl CHANGE i j BIGINT;
同理,如果想利用 CHANGE 將 j 從 BIGINT 轉(zhuǎn)為 INT,并且不改變列名,則語句如下:
mysql> ALTER TABLE testalter_tbl CHANGE j j INT;
在利用 MODIFY 或 CHANGE 修改列時(shí),還可以指定該列是否能有 NULL 值,以及它的默認(rèn)值。事實(shí)上,如果我們不這樣處理,MySQL 會(huì)自動(dòng)為這些屬性指定相關(guān)值。
例如,NOT NULL 列默認(rèn)值為100:
mysql> ALTER TABLE testalter_tbl
-> MODIFY j BIGINT NOT NULL DEFAULT 100;
如果不使用上述命令,則MySQL 會(huì)在所有這些列中填充 NULL 值。
使用 ALTER 命令可以改變?nèi)魏瘟械哪J(rèn)值,如下例所示:
mysql> ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | 1000 | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
使用 DROP 子句與 ALTER 命令,可以去除任何列中的默認(rèn)限制。
mysql> ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
mysql> SHOW COLUMNS FROM testalter_tbl;
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| c | char(1) | YES | | NULL | |
| i | int(11) | YES | | NULL | |
+-------+---------+------+-----+---------+-------+
2 rows in set (0.00 sec)
結(jié)合使用 TYPE 子句與 ALTER 命令,可以使用表類型。在下面范例中,將表 testalter_tbl 的表類型變?yōu)?MYISAM。
通過 SHOW TABLE STATUS 語句可以顯示當(dāng)前的表類型。
mysql> ALTER TABLE testalter_tbl TYPE = MYISAM;
mysql> SHOW TABLE STATUS LIKE 'testalter_tbl'\G
*************************** 1. row ****************
Name: testalter_tbl
Type: MyISAM
Row_format: Fixed
Rows: 0
Avg_row_length: 0
Data_length: 0
Max_data_length: 25769803775
Index_length: 1024
Data_free: 0
Auto_increment: NULL
Create_time: 2007-06-03 08:04:36
Update_time: 2007-06-03 08:04:36
Check_time: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
使用 ALTER TABLE 語句的 RENAME 選項(xiàng)可以對(duì)表進(jìn)行重命名。下面范例將表 testalter_tbl 重新命名為 alter_tbl。
mysql> ALTER TABLE testalter_tbl RENAME TO alter_tbl;
還可以使用 ALTER 命令來創(chuàng)建并刪除 MySQL 文件中的索引。下一節(jié)再介紹這種用法。