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,因为这在现实世界中更常用。决定仍然取决于用户。

更改现有表的名称

在多种情况下,数据库管理员或用户可能需要修改MySQL数据库中表的名称。此操作在向表添加新的信息列后,通常用于为特定表分配更相关的名称。

有两种方法可以更改MySQL中现有表的名称。这两种方法都需要用户实现RENAME查询。在第一种方法中,使用ALTER TABLE语句在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语句更改锁定表的名称。唯一的要求是表应该使用WRITE锁定或修改WRITE-LOCKED表的前一步的多表RENAME操作的产品。例如,用户可以执行以下操作:

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教程

计算机教程

大数据教程

开发工具教程