SQL 基础教程
SQL 连接
SQL 高级教程
SQL 参考资料

SQL ALTER TABLE 语句

在本教程中,您将学习如何使用 SQL 更改或修改现有表。

修改现有表

很有可能在创建表之后,当您开始使用它时,您可能会发现您忘记提及任何列或约束,或者为列指定了错误的名称。

在这种情况下,您可以使用 ALTER TABLE 语句通过添加、更改或删除表中的列来更改或更改现有表。

假设我们的数据库中有一个 shippers 表,其结构如下:

+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| shipper_id   | int         | NO   | PRI | NULL    | auto_increment |
| shipper_name | varchar(60) | NO   |     | NULL    |                |
| phone        | varchar(60) | NO   |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+

我们将把这个 shippers 表用于我们的所有 ALTER TABLE 语句。

现在假设我们要通过添加一列来扩展现有的 shippers 表。 但是,问题是我们如何使用 SQL 命令来做到这一点? 好吧,让我们找出答案。

添加新列

可以通过以下方式给出将新列添加到现有表的基本语法:

ALTER TABLE table_name ADD column_name data_type constraints;

以下语句将新列 fax 添加到 shippers 表中。

ALTER TABLE shippers ADD fax VARCHAR(20);

现在,执行上述语句后,如果您在 MySQL 命令行中使用命令 DESCRIBE shippers; 看到表结构,则如下所示:

+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| shipper_id   | int         | NO   | PRI | NULL    | auto_increment |
| shipper_name | varchar(60) | NO   |     | NULL    |                |
| phone        | varchar(60) | NO   |     | NULL    |                |
| fax          | varchar(20) | YES  |     | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+

注意:如果要向现有表添加 NOT NULL 列,则必须指定显式 默认值。 此默认值用于为表中已存在的每一行填充新列。

提示: 向表中添加新列时,如果既未指定 NULL 也未指定 NOT NULL,则将该列视为已指定 NULL

MySQL 默认在末尾添加新列。 但是,如果要在特定列之后添加新列,可以使用 AFTER 子句,如下所示:

mysql> ALTER TABLE shippers ADD fax VARCHAR(20) AFTER shipper_name;

MySQL 提供了另一个子句 FIRST,您可以使用它在表中的第一个位置添加新列。 只需将前面示例中的子句 AFTER 替换为 FIRST 即可在 shippers 表的开头添加列 fax


更改列位置

在 MySQL 中,如果您已经创建了一个表,但对表中现有的列位置不满意,您可以随时使用以下语法更改它:

ALTER TABLE table_name
MODIFY column_name column_definition AFTER column_name;

以下语句将列 fax 放在 shippers 表中的 shipper_name 列之后。

mysql> ALTER TABLE shippers MODIFY fax VARCHAR(20) AFTER shipper_name;

添加约束

我们目前的托运人表存在一个主要问题。 如果您插入具有重复电话号码的记录,它不会阻止您这样做,这不好,它应该是唯一的。

您可以通过将约束 UNIQUE 添加到 phone 列来解决此问题。 将此约束添加到现有表列的基本语法可以通过以下方式给出:

ALTER TABLE table_name ADD UNIQUE (column_name,...);

以下语句将约束 UNIQUE 添加到 phone 列。

mysql> ALTER TABLE shippers ADD UNIQUE (phone);

执行此语句后,如果您尝试插入重复的电话号码,则会收到错误消息。

同样,如果您创建了一个没有 PRIMARY KEY 的表,您可以添加一个:

ALTER TABLE table_name ADD PRIMARY KEY (column_name,...);

如果未定义,以下语句将主键约束 PRIMARY KEY 添加到 shipper_id 列。

mysql> ALTER TABLE shippers ADD PRIMARY KEY (shipper_id);

删除列

从现有表中删除列的基本语法可以通过以下方式给出:

ALTER TABLE table_name DROP COLUMN column_name;

以下语句从 shippers 表中删除了我们新添加的列 fax

mysql> ALTER TABLE shippers DROP COLUMN fax;

现在,执行上述语句后,如果您看到表结构,则如下所示:

+--------------+-------------+------+-----+---------+----------------+
| Field        | Type        | Null | Key | Default | Extra          |
+--------------+-------------+------+-----+---------+----------------+
| shipper_id   | int         | NO   | PRI | NULL    | auto_increment |
| shipper_name | varchar(60) | NO   |     | NULL    |                |
| phone        | varchar(20) | NO   | UNI | NULL    |                |
+--------------+-------------+------+-----+---------+----------------+

更改列的数据类型

您可以使用 ALTER 子句修改 SQL Server 中列的数据类型,如下所示:

ALTER TABLE table_name ALTER COLUMN column_name new_data_type;

然而,MySQL 数据库服务器不支持 ALTER COLUMN 语法。 它支持备用 MODIFY 子句,您可以使用它来修改列,如下所示:

ALTER TABLE table_name MODIFY column_name new_data_type;

以下语句将 shippers 表中 phone 列的当前数据类型从 VARCHAR 更改为 CHAR 并将长度从 20 更改为 15。

mysql> ALTER TABLE shippers MODIFY phone CHAR(15);

同样,您可以使用 MODIFY 子句通过重新指定现有列定义并在末尾添加 NULLNOT NULL 约束来切换 MySQL 表中的列是否应允许空值,如下所示:

mysql> ALTER TABLE shippers MODIFY shipper_name CHAR(15) NOT NULL;

修改表名

在 MySQL 中重命名现有表的基本语法可以通过以下方式给出:

ALTER TABLE current_table_name RENAME new_column_name;

以下语句将我们的 shippers 表重命名为 shipper

mysql> ALTER TABLE shippers RENAME shipper;

您也可以在 MySQL 中使用 RENAME TABLE 语句实现相同的目的,如下所示:

mysql> RENAME TABLE shippers TO shipper;
Advertisements