MYSQL – 修改、删除、重命名、修改

⚡ 智能摘要

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

  • 🛠️ ALTER 命令: ALTER TABLE 重新定义一个已存在的对象,因此实时模式无需重建即可吸收新的需求。
  • 添加列: ALTER TABLE ADD COLUMN 会添加一个字段,现有行将保留其已有的所有值。
  • 🗑️ DROP 命令: DROP 会永久删除:数据库、表或通过 ALTER TABLE DROP COLUMN 删除的单个列。
  • 🔁 重命名命令: RENAME TABLE 只会更改表的名称,不会丢失表中的任何数据。
  • ✏️ 更改关键词: CHANGE 语句在一个语句中重命名列并重新定义其类型和约束,因此两个列名都是必需的。
  • 🧩 修改关键词: MODIFY 会更改类型和约束,同时保留ping 对于仅需进行文本编辑的情况来说,这个名称是更安全的选择。
  • 📍 关键词之后: AFTER 函数会将新添加的列放置在选定的位置,而不是表格的末尾。

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 命令会永久删除对象。它用于……

  1. 从数据库中删除数据库 MySQL 服务器.
  2. 从数据库中删除对象,例如表或列。

⚠️警告: 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 关键字允许您

  1. 更改列名
  2. 更改列数据类型
  3. 更改列约束

举个例子。成员表中的 full_names 字段是 varchar 数据类型,宽度为 350,如下面的脚本所示。

SHOW COLUMNS FROM `members`;
领域 类型 主要 默认 追求卓越
会员号码 INT(11) 没有 PRI 自动递增
全名 varchar(350) 没有
性别 varchar(6) 可以
出生日期 日期 可以
实际地址 varchar(255) 可以
邮政地址 varchar(255) 可以
联系电话 varchar(75) 可以
电子邮件 varchar(255) 可以

假设要求是

  1. 将字段名称从“full_names”更改为“fullname”。
  2. 将其更改为宽度为 250 的字符数据类型。
  3. 添加 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 关键字允许您

  1. 修改列数据类型
  2. 修改列约束

在上面的 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”的作用相同,它会将新列移动到表格的最前面。

常见问题

不。诸如 ALTER、DROP 和 RENAME 之类的 DDL 语句会隐式地提交更改。 MySQL因此,未完成的事务无法撤销这些操作。从备份恢复是唯一的恢复途径。

这取决于具体的变更。许多 InnoDB 的修改都是在线进行的,允许并发读写,而另一些则会复制整个表并阻塞写入操作。添加 ALGORITHM 和 LOCK 子句来明确你允许的操作。

DROP 会删除对象本身。TRUNCATE 会清空表,但保留其结构。 删除 删除选定的行,并可使用 WHERE 子句进行筛选。

通常是的。例如,内置于客户端中的人工智能助手。 MySQL 工作台 将类似“在 date_of_birth 之后添加一个可为空的日期列”的请求转换为有效的语法。 Rev在运行语句之前,请先将其与实时模式进行比对。

只能部分解决。人工智能审查工具会标记出明显的风险,例如查询中仍然包含已删除列的名称,或者因类型缩小而导致数据截断。但它们无法看到每个调用者,因此仍然需要进行预测试运行。

总结一下这篇文章: