当你想要更改表名,任何表字段或者想要添加或删除表中的现有列时,
MySQLi ALTER 命令非常有用.
让我们从创建一个名为 tutorials_alter 的表开始.
root@host# mysql -u root -p password; Enter password:******* mysql> use TUTORIALS; Database changed mysql> create table tutorials_alter -> ( -> i INT, -> c CHAR(1) -> ); Query OK, 0 rows affected (0.27 sec) mysql> SHOW COLUMNS FROM tutorials_alter; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | i | int(11) | YES | | NULL | | | c | char(1) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.02 sec)
假设您要从MySQLi表上方删除现有列 i ,那么您将使用 DROP 子句以及 ALTER 命令,如下所示 :
mysql> ALTER TABLE tutorials_alter DROP i;
如果列是表格中唯一的列,则 DROP 将无效.
要添加列,请使用ADD并指定列定义.以下语句将 i 列恢复为tutorials_alter :
mysql> ALTER TABLE tutorials_alter ADD i INT;
发出此语句后,testalter将包含与第一次创建表时相同的两列,但结构不完全相同.这是因为默认情况下会将新列添加到表的末尾.所以即使 i 最初是mytbl中的第一列,现在它是最后一列.
mysql> SHOW COLUMNS FROM tutorials_alter; +-------+---------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------+------+-----+---------+-------+ | c | char(1) | YES | | NULL | | | i | int(11) | YES | | NULL | | +-------+---------+------+-----+---------+-------+ 2 rows in set (0.01 sec)
表示您想要在表格中的特定位置使用列,使用FIRST使其成为第一列或AFTER col_name以指示新列应放在col_name之后.尝试下面的ALTER TABLE语句,在每个语句之后使用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;
FIRST和AFTER说明符仅适用于ADD子句.这意味着如果要重新定位表中的现有列,首先必须对其进行DROP,然后在新位置添加它.
要更改列的定义,请使用 MODIFY 或 CHANGE 子句以及ALTER命令.例如,要将列 c 从CHAR(1)更改为CHAR(10),请执行以下操作 :
mysql> ALTER TABLE tutorials_alter MODIFY c CHAR(10);
使用CHANGE,语法略有不同.在CHANGE关键字之后,为要更改的列命名,然后指定新定义,其中包括新名称.试试下面的例子:
mysql> ALTER TABLE tutorials_alter CHANGE i j BIGINT;
如果现在使用CHANGE将j从BIGINT转换回INT而不更改列名,则语句将按预期 :
mysql> ALTER TABLE tutorials_alter CHANGE j j INT;
当您修改或更改列时,您还可以指定列是否可以包含NULL值以及它的默认值.实际上,如果你不这样做,MySQLi会自动为这些属性赋值.
这是一个例子,其中NOT NULL列默认值为100.
mysql> ALTER TABLE tutorials_alter -> MODIFY j BIGINT NOT NULL DEFAULT 100;
如果你不使用上面的命令,那么MySQLi将填满所有列中的NULL值.
您可以使用ALTER命令更改任何列的默认值.试试下面的例子.
mysql> ALTER TABLE tutorials_alter ALTER j SET DEFAULT 1000; mysql> SHOW COLUMNS FROM tutorials_alter; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c | char(10) | YES | | NULL | | | j | bigint(20) | NO | | 1000 | | +-------+------------+------+-----+---------+-------+ 2 rows in set (0.02 sec)
您可以使用DROP子句从任何列中删除默认约束使用ALTER命令.
mysql> ALTER TABLE tutorials_alter ALTER j DROP DEFAULT; mysql> SHOW COLUMNS FROM tutorials_alter; +-------+------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------+------+-----+---------+-------+ | c | char(10) | YES | | NULL | | | j | bigint(20) | NO | | NULL | | +-------+------------+------+-----+---------+-------+ 2 rows in set (0.02 sec)
您可以使用 TYPE 子句以及ALTER命令来使用表类型.
要查找表的当前类型,请使用SHOW TABLE STATUS声明.
mysql> SHOW TABLE STATUS LIKE 'tutorials_alter'\G *************************** 1. row *************************** Name: tutorials_alter Engine: InnoDB Version: 10 Row_format: Compact Rows: 0 Avg_row_length: 0 Data_length: 16384 Max_data_length: 0 Index_length: 0 Data_free: 0 Auto_increment: NULL Create_time: 2017-02-17 11:30:29 Update_time: NULL Check_time: NULL Collation: latin1_swedish_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec)
重命名表,使用ALTER TABLE语句的 RENAME 选项.尝试以下示例将tutorials_alter重命名为tutorials_bks.
mysql> ALTER TABLE tutorials_alter RENAME TO tutorials_bks;
您可以使用ALTER命令在MySQL文件上创建和删除INDEX.我们将在下一章中看到这个功能.