更改 MySQL 中的表名

2025年3月17日 | 阅读 7 分钟

模式中每个表都有一个唯一的名称。在 MySQL 中,有两种方法可以确定模式中表的名称。用户可以使用 show 关键字显示表名,或者使用 INFORMATION_SCHEMA 查询。

给 MySQL 表命名

  1. 用户可以在命名数据库对象时使用大写和小写字母。建议在命名时使用全小写字母,并使用下划线分隔数据库对象名称中的单词。表名可以是单数,也可以是复数。然而,在特定的模式中遵循特定的约定更好。
  2. 如果您的表存储的是关于代表真实世界实体特征的真实世界实体的信息,那么名称应该是名词。这些表的例子有 student、employee、customer 和 city。最好描述表中存储的数据。这样可以使其他用户更容易理解数据库和表中存储的数据。
  3. 如果您想使用多个单词来描述表名及其存储的数据,那么您可以这样做。考虑一个包含不同商品销售价格信息的表。用户可以简单地使用 selling_price 作为表名,尤其是当用户已经在数据库中为另一个表使用了 price 时。此外,如果用户只使用 selling 作为表名,其他用户将很难确定其中存储的数据。因此,selling_price 这个名字更适合上述场景,因为它提供了其信息的清晰图景。
  4. 假设该表使用外键表示同一数据库中两个表之间的关系。在这种情况下,最好使用这两个表的名称,并用一个动词来描述它们之间的关系。
  5. 假设用户有两个表,第一个表存储有关不同用户的信息,第二个表存储可以分配给用户的可能用户。假设用户想在这些表之间添加多对多关系。这意味着多个用户可以拥有多个行,反之亦然,那么表名可以是 user_has_roles,或者用户可以省略动词,简写为 user_role。
  6. 如果表之间存在逻辑关系,用户可以例外。例如,如果用户有两个表 product 和 invoice,并且想要一个表来指定哪个产品在哪个发票中,那么用户可以简单地使用 invoice_product 或 invoice_contains_product 作为名称。但将其命名为 invoice_item 会更好,因为它在现实世界中更常用。这个决定仍然取决于用户。

更改现有表的名称

在多种情况下,DBA 或用户可能需要修改 MySQL 数据库中表的名称。执行此操作是为了给特定表分配一个更相关的名称,尤其是在向表中添加新的信息列之后。

有两种方法可以更改 MySQL 中现有表的名称。这两种方法都需要用户实现 RENAME 查询。在第一种方法中,RENAME TABLE 命令在 MySQL 中与 ALTER table 语句一起实现。

任何具有适当权限的数据库用户都可以使用 MySQL 的 RENAME TABLE 命令和 ALTER TABLE 语句轻松更改表的名称。

使用 RENAME TABLE 语句

RENAME TABLE 的语法如下:

使用 RENAME TABLE 的优点是用户可以同时更改多个表的名称。

用户需要对数据库拥有某些权限才能保留在表中。用户必须拥有现有表的 ALTER 和 DROP 权限,以及新表的 CREATE 和 INSERT 权限。

例如,如果用户想将一个名为 old_t 的现有表重命名为 new_t,那么用户可以执行以下语句:

上述语句可以用 ALTER TABLE 语句替换来更改表名

RENAME TABLE 语句优于 ALTER TABLE,因为与 RENAME TABLE 不同,ALTER TABLE 一次只能更改一个表的名称。RENAME TABLE 可以同时更改多个表的名称。

RENAME TABLE 提供了更大的灵活性,因为用户可以通过执行单个语句来更改多个表的名称。它更具可读性,因为用户可以跟踪已更改名称的表。在修改带有新预填充版本的表名时,它尤其受欢迎。

上述语句从左到右执行。这意味着重命名从左侧开始,然后更改下一个表名。它确保在更改同一个 RENAME 语句中已更改名称的现有表的名称时不会发生冲突。用户不需要担心此操作,因为它以原子方式完成。

它还允许用户交换两个表的名称。这可以通过创建一个临时表来完成。让我们考虑一个中间表 temp_table 尚不存在的场景

然后用户可以通过在 MySQL 中执行以下语句来简单地交换两个表的名称:

表上的元数据锁按名称顺序获取;这可能是一个问题,因为在某些情况下,当同时实现多个事务时,它可能导致操作结果的差异。

在 MySQL 8.0.13 的后期版本中,用户可以使用 LOCK TABLES 语句更改被锁定表的名称。唯一的要求是,表必须使用 WRITE 锁锁定,或者在多表 RENAME 操作的先前步骤中修改了 WRITE 锁定的表。例如,用户可以实现这一点:

用户不能在以下语句中执行 RENAME 命令

在 MySQL 8.0.13 的早期版本中,用户可以实现 RENAME TABLE;不应有 LOCK TABLES 已获取的锁定。

当满足事务表的锁定条件时,RENAME 操作会以原子方式执行;这确保了没有其他会话可以访问任何正在执行 rename 命令的表。如果在 RENAME TABLE 执行期间发生任何错误,则整个语句将失败,并且不会对表进行任何修改。

用户还可以实现 RENAME TABLE 将表从一个数据库移动到另一个数据库

使用上述语句将所有表从一个数据库移动到另一个数据库,实际上会重命名数据库的名称。原始数据库不会被修改,并且保持不变。

  • 与 RENAME TABLE 类似,ALTER TABLE ? NAME 使​​用户能够将表传输到不同的数据库。如果重命名语句将表的位置更改为不同文件系统上的数据库,则它不会执行该查询。然后操作的成功执行取决于平台。它由用于传输表文件的底层操作系统调用决定。
  • 如果表中实现了触发器,并且用户尝试将表的名称修改到另一个数据库,则尝试会因触发器在错误的模式中而失败。它将返回 ER_TRG_IN_WRONG_SCHEMA 错误。
  • 用户可以将未加密表的位置更改为加密数据库,反之亦然。但是,如果启用了 table_encryption_privilege_check 变量,用户将需要加密管理员权限。此附加权限是必需的,因为加密设置可能与默认数据库加密不同。
  • 如果用户想更改临时表的名称,则 RENAME table 命令将不起作用。相反,用户必须实现 ALTER TABLE 命令来修改名称。
  • RENAME TABLE 也可以实现来更改视图的名称,但用户不能更改不同数据库中视图的名称。
  • 为重命名的表或视图专门授予的任何权限都不会迁移到新名称。它们必须手动更改。

ALTER 和 RENAME 命令的实现

用户可以一次使用 ALTER 和 RENAME 命令更改表的名称。

输出

Change Table Name In MySQL

用户可以使用 RENAME 语句通过单个命令更改多个表的名称。下面是一个用于实现 RENAME 查询的示例查询。

输出

Change Table Name In MySQL