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 命令来做到这一点? 好吧,让我们找出答案。
添加新列
可以通过以下方式给出将新列添加到现有表的基本语法:
以下语句将新列 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 提供了另一个子句 FIRST
,您可以使用它在表中的第一个位置添加新列。 只需将前面示例中的子句 AFTER
替换为 FIRST
即可在 shippers 表的开头添加列 fax。
更改列位置
在 MySQL 中,如果您已经创建了一个表,但对表中现有的列位置不满意,您可以随时使用以下语法更改它:
MODIFY column_name column_definition AFTER column_name;
以下语句将列 fax 放在 shippers 表中的 shipper_name 列之后。
添加约束
我们目前的托运人表存在一个主要问题。 如果您插入具有重复电话号码的记录,它不会阻止您这样做,这不好,它应该是唯一的。
您可以通过将约束 UNIQUE
添加到 phone 列来解决此问题。 将此约束添加到现有表列的基本语法可以通过以下方式给出:
以下语句将约束 UNIQUE
添加到 phone 列。
执行此语句后,如果您尝试插入重复的电话号码,则会收到错误消息。
同样,如果您创建了一个没有 PRIMARY KEY
的表,您可以添加一个:
如果未定义,以下语句将主键约束 PRIMARY KEY
添加到 shipper_id 列。
删除列
从现有表中删除列的基本语法可以通过以下方式给出:
以下语句从 shippers 表中删除了我们新添加的列 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 中列的数据类型,如下所示:
然而,MySQL 数据库服务器不支持 ALTER COLUMN
语法。 它支持备用 MODIFY
子句,您可以使用它来修改列,如下所示:
以下语句将 shippers 表中 phone 列的当前数据类型从 VARCHAR
更改为 CHAR
并将长度从 20 更改为 15。
同样,您可以使用 MODIFY
子句通过重新指定现有列定义并在末尾添加 NULL
或 NOT NULL
约束来切换 MySQL 表中的列是否应允许空值,如下所示:
修改表名
在 MySQL 中重命名现有表的基本语法可以通过以下方式给出:
以下语句将我们的 shippers 表重命名为 shipper。
您也可以在 MySQL 中使用 RENAME TABLE
语句实现相同的目的,如下所示: