📜  MySQLi-ALTER命令

📅  最后修改于: 2020-11-27 06:22:36             🧑  作者: Mango


当您想要更改表的名称,任何表字段或想要添加或删除表中的现有列时,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将包含与第一次创建表时相同的两列,但结构不完全相同。这是因为默认情况下,新列添加到表的末尾。因此,即使最初是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子句一起使用。这意味着,如果要重新定位表中的现有列,则必须先删除它,然后再将其添加到新位置。

更改列定义或名称

要更改列的定义,请使用MODIFYCHANGE子句以及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;

ALTER TABLE对Null和默认值属性的影响-

当您修改或更改列时,还可以指定该列是否可以包含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。我们将在下一章中看到此功能。