MYSQL – 修改、删除、重命名、修改
⚡ 智能摘要
ALTER、DROP、RENAME 和 MODIFY 是 MySQL 这些命令用于在数据库正在使用后对其进行重塑。它们可以添加、删除、重命名和重新定义表和列等对象,而不会丢弃已存储的行。

什么是 ALTER 命令? MySQL?
此 改变 该命令用于修改现有数据库、表、视图或其他需要在数据库生命周期内进行更改的数据库对象。它允许在数据库模式创建并填充数据后对其进行演化。
业务需求很少一成不变,数据库设计也必须随之调整。假设 Myflix 数据库的设计已经实现,用户也开始使用它,这时团队才意识到遗漏了一些关键信息。没有人想丢失现有的数据行;他们只是想把新信息记录在现有数据旁边。
ALTER 语句正是用于处理这种情况。它可以将字段的数据类型从字符串更改为数字,重命名字段,或者向表中添加一个全新的列,所有这些操作都会保持表中已存储的数据不变。
确定了命令的目的之后,下一步就是编写执行该命令的语法。
MySQL ALTER 语法
下面显示的是向已存在的表中添加列的基本语法。
ALTER TABLE `table_name` ADD COLUMN `column_name` `data_type`;
点击这里
- “更改表`表名`” 是告诉的命令 MySQL 服务器修改名为“table_name”的表。
- “添加列‘列名’‘数据类型’” 是告诉的命令 MySQL 服务器将添加一个名为 `column_name` 的新列,数据类型为 `data_type`。
假设 Myflix 推出了在线计费和支付功能。为了支持这项功能,需要在会员表中添加一个信用卡号字段。在进行任何修改之前,最好先查看一下现有表的结构。以下脚本可以完成这项工作。
SHOW COLUMNS FROM `members`;
| 领域 | 类型 | 空 | 主要 | 默认 | 追求卓越 |
|---|---|---|---|---|---|
| 会员号码 | INT(11) | 没有 | PRI | 无 | 自动递增 |
| 全名 | varchar(350) | 没有 | 无 | ||
| 性别 | varchar(6) | 可以 | 无 | ||
| 出生日期 | 日期 | 可以 | 无 | ||
| 实际地址 | varchar(255) | 可以 | 无 | ||
| 邮政地址 | varchar(255) | 可以 | 无 | ||
| 联系电话 | varchar(75) | 可以 | 无 | ||
| 电子邮件 | varchar(255) | 可以 | 无 |
💡 关于 int(11) 的说明: 括号内的数字仅为显示宽度。 MySQL 8.0.17 版本已弃用整数类型的该列,因此现代服务器会将此列简单地报告为: INT存储空间大小不变。
下面所示的脚本会将新字段添加到 members 表中。
ALTER TABLE `members` ADD COLUMN `credit_card_number` VARCHAR(25);
针对 myflixdb 执行此脚本,会在 members 表中添加一个名为 credit_card_number 的列,数据类型为 VARCHAR。再次运行 SHOW COLUMNS 脚本,得到以下结果。
| 领域 | 类型 | 空 | 主要 | 默认 | 追求卓越 |
|---|---|---|---|---|---|
| 会员号码 | INT(11) | 没有 | PRI | 无 | 自动递增 |
| 全名 | varchar(350) | 没有 | 无 | ||
| 性别 | varchar(6) | 可以 | 无 | ||
| 出生日期 | 日期 | 可以 | 无 | ||
| 实际地址 | varchar(255) | 可以 | 无 | ||
| 邮政地址 | varchar(255) | 可以 | 无 | ||
| 联系电话 | varchar(75) | 可以 | 无 | ||
| 电子邮件 | varchar(255) | 可以 | 无 | ||
| 信用卡号码 | varchar(25) | 可以 | 无 |
高亮显示的行确认 credit_card_number 已添加到 members 表中,并且其他列中已有的数据不受此添加的影响。
添加列只是问题的一半。模式还需要删除不再需要的对象,这正是 DROP 命令的作用。
什么是 DROP 命令? MySQL?
DROP 命令会永久删除对象。它用于……
- 从数据库中删除数据库 MySQL 服务器.
- 从数据库中删除对象,例如表或列。
⚠️警告: DROP 操作不可逆。没有备份,对象及其内部的行都无法恢复,因此请先对目标执行 SELECT 查询并确认备份。
Dropping 一列
在上面的 ALTER 示例中,成员表中添加了一个名为 credit_card_number 的列。假设在线账单功能被推迟,需要再次删除该列。以下脚本可以实现此功能。
ALTER TABLE `members` DROP COLUMN `credit_card_number`;
执行脚本后,成员表中的 credit_card_number 列将被删除。再次列出所有列,确认了这一结果。
SHOW COLUMNS FROM `members`;
| 领域 | 类型 | 空 | 主要 | 默认 | 追求卓越 |
|---|---|---|---|---|---|
| 会员号码 | INT(11) | 没有 | PRI | 无 | 自动递增 |
| 全名 | varchar(350) | 没有 | 无 | ||
| 性别 | varchar(6) | 可以 | 无 | ||
| 出生日期 | 日期 | 可以 | 无 | ||
| 实际地址 | varchar(255) | 可以 | 无 | ||
| 邮政地址 | varchar(255) | 可以 | 无 | ||
| 联系电话 | varchar(75) | 可以 | 无 | ||
| 电子邮件 | varchar(255) | 可以 | 无 |
信用卡号码已从字段列表中移除。
掉落表
从数据库中删除整个表的语法如下。
DROP TABLE `sample_table`;
将此语句应用于实际对象时,它看起来是这样的。
DROP TABLE `categories_archive`;
执行此操作会从数据库中删除名为 `categories_archive` 的表及其中的所有行。
删除数据库
同一个关键字会删除整个模式。添加 IF EXISTS 可以抑制该错误。 MySQL 当目标已消失时会引发异常,这在多次运行的脚本中非常有用。
DROP DATABASE IF EXISTS `myflixdb_backup`;
删除对象是永久性的。如果对象本身应该保留,只是名称错误,则应使用 RENAME 命令。
什么是 RENAME 命令? MySQL?
RENAME 命令将现有数据库对象(例如表或列)的名称更改为新名称。 重命名表格不会导致表格中包含的任何数据丢失。
该命令的基本语法如下。
RENAME TABLE `current_table_name` TO `new_table_name`;
要将 movierentals 表重命名为 movie_rentals,可以使用以下脚本。
RENAME TABLE `movierentals` TO `movie_rentals`;
执行此操作会将表 `movierentals` 重命名为 `movie_rentals`。由于重命名只是更改了标签,因此反向执行相同的语句即可恢复原始名称。
RENAME TABLE `movie_rentals` TO `movierentals`;
RENAME TABLE 函数用于更改表的名称。重命名表 栏而改变它所包含的内容,正是 CHANGE 关键字的作用。
更改关键词
CHANGE 关键字允许您
- 更改列名
- 更改列数据类型
- 更改列约束
举个例子。成员表中的 full_names 字段是 varchar 数据类型,宽度为 350,如下面的脚本所示。
SHOW COLUMNS FROM `members`;
| 领域 | 类型 | 空 | 主要 | 默认 | 追求卓越 |
|---|---|---|---|---|---|
| 会员号码 | INT(11) | 没有 | PRI | 无 | 自动递增 |
| 全名 | varchar(350) | 没有 | 无 | ||
| 性别 | varchar(6) | 可以 | 无 | ||
| 出生日期 | 日期 | 可以 | 无 | ||
| 实际地址 | varchar(255) | 可以 | 无 | ||
| 邮政地址 | varchar(255) | 可以 | 无 | ||
| 联系电话 | varchar(75) | 可以 | 无 | ||
| 电子邮件 | varchar(255) | 可以 | 无 |
假设要求是
- 将字段名称从“full_names”更改为“fullname”。
- 将其更改为宽度为 250 的字符数据类型。
- 添加 NOT NULL 约束
这三项修改均通过一条 CHANGE 语句完成。
ALTER TABLE `members` CHANGE COLUMN `full_names` `fullname` char(250) NOT NULL;
对 myflixdb 执行该操作,然后运行 SHOW COLUMNS 脚本,得到以下结果。
| 领域 | 类型 | 空 | 主要 | 默认 | 追求卓越 |
|---|---|---|---|---|---|
| 会员号码 | INT(11) | 没有 | PRI | 无 | 自动递增 |
| 全名 | 字符(250) | 没有 | 无 | ||
| 性别 | varchar(6) | 可以 | 无 | ||
| 出生日期 | 日期 | 可以 | 无 | ||
| 实际地址 | varchar(255) | 可以 | 无 | ||
| 邮政地址 | varchar(255) | 可以 | 无 | ||
| 联系电话 | varchar(75) | 可以 | 无 | ||
| 电子邮件 | varchar(255) | 可以 | 无 |
该列现在名为 fullname,包含 char(250) 类型,并且拒绝 NULL 值。
修改关键词
MODIFY 关键字允许您
- 修改列数据类型
- 修改列约束
在上面的 CHANGE 示例中,即使重命名只是目标的一部分,也必须提供两次字段名称。 CHANGE 语句中省略字段名称会引发错误。 当只需要调整数据类型和约束条件,而名称保持不变时,MODIFY 只需提及一次列即可完成此操作。
以下脚本将“fullname”字段的宽度从 250 更改为 50。
ALTER TABLE `members` MODIFY `fullname` char(50) NOT NULL;
对 myflixdb 执行该脚本,然后运行 SHOW COLUMNS 脚本,即可得到如下所示的结果。
| 领域 | 类型 | 空 | 主要 | 默认 | 追求卓越 |
|---|---|---|---|---|---|
| 会员号码 | INT(11) | 没有 | PRI | 无 | 自动递增 |
| 全名 | 字符(50) | 没有 | 无 | ||
| 性别 | varchar(6) | 可以 | 无 | ||
| 出生日期 | 日期 | 可以 | 无 | ||
| 实际地址 | varchar(255) | 可以 | 无 | ||
| 邮政地址 | varchar(255) | 可以 | 无 | ||
| 联系电话 | varchar(75) | 可以 | 无 | ||
| 电子邮件 | varchar(255) | 可以 | 无 |
⚠️警告: 缩小列宽会截断超出列宽范围的数据。任何长度超过 50 个字符的名称都会被此语句截断,因此请检查现有最长值。 选择 在缩小字段之前进行查询。
更改、修改和重命名列
这三个关键词存在重叠,选错关键词是该领域最常见的错误来源。下表将它们并列列出。
| 关键字 | 重命名列 | 更改类型和约束 | 旧名称 | 典型用途 |
|---|---|---|---|---|
| 更改 | 是 | 是 | 是的,还有新名称 | 在一个语句中重命名和重新定义 |
| 调整 | 没有 | 是 | 曾用名 | 加宽、缩窄或重新输入列的格式 |
| 重命名列 | 是 | 没有 | 是的,还有新名称 | 仅重命名,从 MySQL 8.0以上 |
MySQL 8.0 为最简单的情况增加了第四个选项,即重命名而不进行任何重新定义。
ALTER TABLE `members` RENAME COLUMN `fullname` TO `full_name`;
类型和名称都已确定。剩下的问题是新列在表中的位置,这由 AFTER 关键字控制。
关键词之后
默认情况下,使用 ALTER TABLE 命令添加的列会位于表的末尾。要将其放置在特定位置,需要将 ALTER 命令与 AFTER 关键字结合使用。
以下脚本在 members 表中将“date_of_registration”直接添加到 date_of_birth 之后。
ALTER TABLE `members` ADD `date_of_registration` date NULL AFTER `date_of_birth`;
对 myflixdb 执行该脚本,然后运行 SHOW COLUMNS 脚本,即可得到如下所示的结果。
| 领域 | 类型 | 空 | 主要 | 默认 | 追求卓越 |
|---|---|---|---|---|---|
| 会员号码 | INT(11) | 没有 | PRI | 无 | 自动递增 |
| 全名 | 字符(50) | 没有 | 无 | ||
| 性别 | varchar(6) | 可以 | 无 | ||
| 出生日期 | 日期 | 可以 | 无 | ||
| 注册日期 | 日期 | 可以 | 无 | ||
| 实际地址 | varchar(255) | 可以 | 无 | ||
| 邮政地址 | varchar(255) | 可以 | 无 | ||
| 联系电话 | varchar(75) | 可以 | 无 | ||
| 电子邮件 | varchar(255) | 可以 | 无 |
高亮显示的行是在“出生日期”列之后添加的列。关键字“FIRST”的作用相同,它会将新列移动到表格的最前面。
