MySQL 重命名表的操作方法及注意事项


Posted in MySQL onMay 21, 2021

 1.重命名表方法

使用 RENAME TABLE 语句或 ALTER TABLE 语句都可以对表进行重命名,基本语法如下:

# RENAME TABLE 语法:
RENAME TABLE
    tbl_name TO new_tbl_name
    [, tbl_name2 TO new_tbl_name2] ...
    
# ALTER TABLE 语法:
ALTER TABLE old_table RENAME new_table;

# 具体示例:
mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| tb1              |
| tb2              |
+------------------+
2 rows in set (0.00 sec)

mysql> rename table tb1 to new_tb1;
Query OK, 0 rows affected (0.03 sec)

mysql> alter table tb2 rename new_tb2;
Query OK, 0 rows affected (0.04 sec)

mysql> show tables;
+------------------+
| Tables_in_testdb |
+------------------+
| new_tb1          |
| new_tb2          |
+------------------+
2 rows in set (0.00 sec)

显然易见,在执行重命名表时,旧表(old_table_name)必须存在,而新表(new_table_name)一定不存在。如果新表  new_table_name 确实存在,该语句将失败。

执行重命名表的用户必须具有原始 table 的 ALTER 和 DROP 权限,以及新 table 的 CREATE 和 INSERT 权限。与 ALTER TABLE 不同,RENAME TABLE 可以在单个语句中重命名多个表:

RENAME TABLE old_table1 TO new_table1,
             old_table2 TO new_table2,
             old_table3 TO new_table3;

若一次性重命名多个表,则重命名操作从左到右执行。因此,要交换两个表名,可以执行此操作(假设中间表名称为tmp_table且不存在):

RENAME TABLE old_table TO tmp_table,
             new_table TO old_table,
             tmp_table TO new_table;

通过重命名表,我们还可以将一个表从一个数据库移动到另一个数据库中,语法如下:

RENAME TABLE current_db.tbl_name TO other_db.tbl_name;
ALTER TABLE current_db.tbl_name rename other_db.tbl_name;

# 拼接SQL 实现将某个数据库中的表全部转移至另一个数据库中
SELECT
 CONCAT( 'rename table old_db.', TABLE_NAME, ' to new_db.', TABLE_NAME, ';' ) 
FROM
 information_schema.TABLES 
WHERE
 TABLE_SCHEMA = 'old_db';

事实上,MySQL 并没有提供重命名数据库的操作,我们可以通过将某个库的所有表都通过重命名转移的另一个库中,来间接实现重命名库,只是原库仍然存在。

  2.注意事项

值得注意的是,重命名操作是原子完成的,需要获取该表的元数据锁,因此我们在执行 RENAME TABLE 前,要确保该表没有活跃的事务且没有被锁定。因为只需更改元数据,所以对于大表重命名也是很迅速的。此外,如果该表具有触发器,则无法将该表通过重命名方式转移到另外一个库中。

其实,RENAME TABLE 语句和 ALTER TABLE 语句还是有部分区别的,查询官方文档,主要有几点如下:

  • RENAME TABLE 适用于视图,但不能将视图重命名转移到其他数据库中,ALTER TABLE 不能重命名视图。
  • ALTER TABLE 可以重命名临时表(TEMPORARY TABLE),RENAME TABLE 不可以。
  • RENAME TABLE 可以在单个语句中重命名多个表,ALTER TABLE 只能重命名一个。

虽然重命名操作快捷迅速,但实际生产场景中,对于表的重命名还是要慎重考虑,也许你的重命名操作没问题,但后续对象之间的依赖调用可能出现问题。比如你将一个表 tb1 重命名为 new_tb1,若有视图及函数依赖 tb1 ,并且你没及时修改这些视图及函数的话,那么再次调用这些视图和函数就可能报错 tb1 不存在,因为在这些视图及函数的定义中,仍用的是 tb1 的名称。此外重命名表或视图后,要注意用户权限问题,如果有显式指定某个用户对该表的权限,则需要重新赋予对新表的权限。若表中存在外键等约束时,执行重命名操作也要格外小心,做好检查。

总结:

本篇文章主要介绍了重命名表的操作方法及注意事项,将本文的重点总结如下:

RENAME TABLE 语句和 ALTER TABLE 语句都可以对表进行重命名,二者稍有区别,更推荐用 RENAME TABLE 语句。

重命名操作需要获取元数据锁,执行前要确保无活跃事务占用。

通过重命名表,可以将一个表从一个数据库转移到另一个数据库中,间接实现重命名数据库。

实际生产场景,重命名表要慎重考虑,特别是存在视图及函数依赖的。

重命名操作执行完成后,要检查用户权限及相关依赖问题,及时将依赖关系中的表名改为新的表名。

若表中存在触发器或外键等约束,重命名时要格外注意。

重命名操作一般在秒级完成,若执行时间过长,请检查链接状态。

以上就是MySQL 重命名表相关知识总结的详细内容,更多关于MySQL 重命名表的资料请关注三水点靠木其它相关文章!

MySQL 相关文章推荐
MySQL 角色(role)功能介绍
Apr 24 MySQL
MySQL中你可能忽略的COLLATION实例详解
May 12 MySQL
IDEA 链接Mysql数据库并执行查询操作的完整代码
May 20 MySQL
.Net Core导入千万级数据至Mysql的步骤
May 24 MySQL
zabbix监控mysql的实例方法
Jun 02 MySQL
MySQL 数据类型详情
Nov 11 MySQL
教你使用VS Code的MySQL扩展管理数据库的方法
Jan 22 MySQL
一文弄懂MySQL中redo log与binlog的区别
Feb 15 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
一次SQL如何查重及去重的实战记录
Mar 13 MySQL
MySQL限制查询和数据排序介绍
Mar 25 MySQL
MySQL 表锁定 LOCK和UNLOCK TABLES的 SQL语法
Apr 18 MySQL
Mysql官方性能测试工具mysqlslap的使用简介
May 21 #MySQL
MySQL官方导出工具mysqlpump的使用
May 21 #MySQL
新手必备之MySQL msi版本下载安装图文详细教程
MySQL数据库压缩版本安装与配置详细教程
MySQL 8.0 之不可见列的基本操作
May 20 #MySQL
Mysql Online DDL的使用详解
May 20 #MySQL
MySQL 存储过程的优缺点分析
May 20 #MySQL
You might like
Yii2实现让关联字段支持搜索功能的方法
2016/08/10 PHP
Laravel框架控制器,视图及模型操作图文详解
2019/12/04 PHP
Prototype Object对象 学习
2009/07/12 Javascript
jquery和js实现对div的隐藏和显示方法
2014/09/26 Javascript
JavaScript实现基于十进制的四舍五入实例
2015/07/17 Javascript
js+flash实现的5图变换效果广告代码(附演示与demo源码下载)
2016/04/01 Javascript
EasyUI加载完Html内容样式渲染完成后显示
2016/07/25 Javascript
基于EasyUI的基础之上实现树形功能菜单
2017/06/28 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
2017/08/08 Javascript
一个简易时钟效果js实现代码
2020/03/25 Javascript
web前端开发中常见的多列布局解决方案整理(一定要看)
2017/10/15 Javascript
webpack4 处理CSS的方法示例
2018/09/03 Javascript
Nuxt.js开启SSR渲染的教程详解
2018/11/30 Javascript
一个Java程序猿眼中的前后端分离以及Vue.js入门(推荐)
2019/04/19 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
[59:44]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 paiN vs iG
2018/03/31 DOTA
用python写asp详细讲解
2013/12/16 Python
Python加密方法小结【md5,base64,sha1】
2017/07/13 Python
pyqt5自定义信号实例解析
2018/01/31 Python
Django数据库类库MySQLdb使用详解
2019/04/28 Python
Selenium+Python 自动化操控登录界面实例(有简单验证码图片校验)
2019/06/28 Python
python 求10个数的平均数实例
2019/12/16 Python
Python如何使用bokeh包和geojson数据绘制地图
2020/03/21 Python
CSS3之多背景background使用示例
2013/10/18 HTML / CSS
CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解
2020/06/01 HTML / CSS
Fossil美国官网:Fossil手表、手袋、珠宝及配件
2017/02/01 全球购物
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
电厂职工自我鉴定
2014/02/20 职场文书
公司总经理岗位职责
2014/03/15 职场文书
努力学习演讲稿
2014/05/10 职场文书
销售督导岗位职责
2015/04/10 职场文书
原告离婚代理词
2015/05/23 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android
python解析json数据
2022/04/29 Python