MySQL中更改表名

MySQL中更改表名

在数据库模式中,每个表都被分配了一个唯一的名称。在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. 用户可以对表之间存在逻辑关系的情况进行例外。例如,如果用户有两个表,产品和发票,并且想要一个表来指定哪个产品在哪个发票中,那么用户可以简单地使用名称invoice_product或invoice_contains_product。但是更好的做法是将其命名为invoice_item,因为它在实际世界中更常用。决定仍然取决于用户。

更改现有表的名称

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

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

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

使用RENAME TABLE语句

使用RENAME TABLE的语法如下:

RENAME TABLE
    table_name TO new_table_name,
table_name2 TO new_table_name2 ..
table_nameN TO new_table_nameN;

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

用户需要一定的数据库权限来保留表中的数据。用户必须对现有表拥有ALTER和DROP权限,并对新表拥有CREATE和INSERT权限。

例如,如果用户想要将现有表的名称从old_t更改为new_t,那么用户可以执行以下语句:

RENAME TABLE old_t TO new_t;

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

ALTER TABLE old_t RENAME new_t;

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

RENAME TABLE old_t1 TO new_t1,
             old_t2 TO new_t2,
             old_t3 TO new_t3;

重新命名表格可以更灵活地让用户通过执行一条语句来更改多个表格的名称。用户可以跟踪表格的名称变化,这样更易读。当修改一个带有新的预填版本的表格的名称时,它特别受欢迎:

RENAME TABLE products TO products_old, products_new TO products;

上述语句从左到右执行。这意味着重命名从左侧开始,然后更改下一个表名。这样做可以确保在同一个RENAME语句中更改了名称的现有表的名称之间没有冲突。用户不需要关注这个操作,因为它是原子性地完成的。

它还使用户能够交换两个表的名称。只需创建一个临时表即可完成。让我们考虑一种情况,不存在名为temp_table的中间表:

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

RENAME TABLE old_t TO temp_table,
new_t TO old_t,
temp_t TO new_t;

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

MySQL 8.0.13的最新版本中,用户可以通过使用LOCK TABLES语句来更改锁定表的名称。唯一的要求是,表必须已经被使用写锁或者修改了写锁的表的结果,以便在多表重命名操作的前一步中使用。例如,用户可以这样实现:

LOCK TABLE old_t1 WRITE;
RENAME TABLE old_t1 TO new_t1,
new_t1 TO new_t2;

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

LOCK TABLE old_t1 READ;
RENAME TABLE old_t1 TO new_t1,
new_t1 TO new_t2;

MySQL 8.0.13之前的版本中,用户可以执行RENAME TABLE;在执行LOCK TABLES命令时不应有任何已获取的锁。

满足事务表的锁定条件后,进行RENAME操作会原子地执行;这确保了任何其他会话无法访问正在执行重命名命令的任何表。如果在执行RENAME TABLE期间发生任何错误,整个语句将失败,并且对表不进行任何修改。

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

RENAME TABLE currentdb.table_name TO anotherdb.table_name;

使用上述语句将所有表从一个数据库移动到另一个数据库,实际上是将数据库的名称更改了。原始数据库没有被修改,仍然存在。

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

ALTER和RENAME命令的实施

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

-- create 
CREATE TABLE EMPLOYEE (
  empId INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  dept TEXT NOT NULL
);

-- insert
INSERT INTO EMPLOYEE VALUES (01, 'Aman', 'Accounts');
INSERT INTO EMPLOYEE VALUES (02, 'Himani', 'Sales');
INSERT INTO EMPLOYEE VALUES (03, 'Vaibhav', 'Maintenance');

-- fetch 
SELECT * FROM EMPLOYEE;

--renaming the table using ALTER and Rename
ALTER TABLE EMPLOYEE RENAME NEWEMP;
SELECT * FROM NEWEMP;

输出:

MySQL中更改表名

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

-- create 
CREATE TABLE EMPLOYEE (
  empId INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  dept TEXT NOT NULL
);
CREATE TABLE STUDENT (
  studentId INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  dept TEXT NOT NULL
);
-- insert
INSERT INTO EMPLOYEE VALUES (01, 'Aman', 'Accounts');
INSERT INTO EMPLOYEE VALUES (02, 'Himani', 'Sales');
INSERT INTO EMPLOYEE VALUES (03, 'Vaibhav', 'Maintenance');

INSERT INTO STUDENT VALUES (01, 'Aman', 'English');
INSERT INTO STUDENT VALUES (02, 'Himani', 'Mathematics');
INSERT INTO STUDENT VALUES (03, 'Vaibhav', 'Science');
-- fetch 
SELECT * FROM EMPLOYEE;
SELECT * FROM STUDENT;
-- renaming the table using ALTER and Rename
RENAME TABLE EMPLOYEE TO NEWEMP, STUDENT TO NEWSTU;
SELECT * FROM NEWEMP;
SELECT * FROM NEWSTU;

输出:

MySQL中更改表名

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程