如何在 MySQL 的一个原子操作中重命名两个表

Posted

技术标签:

【中文标题】如何在 MySQL 的一个原子操作中重命名两个表【英文标题】:How to rename two tables in one atomic operation in MySQL 【发布时间】:2016-03-27 07:06:19 【问题描述】:

我需要在一个原子操作中重命名两个表,这样用户将永远无法看到处于中间状态的数据库。

我正在使用 mysql,注意到documentation 中完美描述了这种情况:

13.3.3 导致隐式提交的语句

本节中列出的语句(以及它们的任何同义词) 隐式结束当前会话中活动的任何事务,就好像 在执行语句之前你已经完成了 COMMIT

[...]

定义或修改数​​据定义语言 (DDL) 语句 数据库对象。 ALTER DATABASE ...升级数据目录名称, 更改事件、更改程序、更改服务器、更改表、更改视图、 创建数据库,创建事件,创建索引,创建过程,创建 服务器,创建表,创建触发器,创建视图,删除数据库,删除 事件、删除索引、删除过程、删除服务器、删除表、删除 触发、删除视图、安装插件(从 MySQL 5.7.6 开始)、重命名表、 截断表,卸载插件(从 MySQL 5.7.6 开始)。

但也许有某种解决方法或类似的东西?

我的情况是这样的:

我在名为current 的表中有一个当前数据集 我在名为next 的表中收集了一个新数据集 我需要在一个原子操作中将current 表重命名为current_%current_date_time%,并将next 表重命名为current

【问题讨论】:

【参考方案1】:

嗯,很简单……

RENAME TABLE current TO current_20151221, next TO current;

如manual 中所述。那里说这是一个原子操作。只是为了澄清这一点,隐式提交与它无关。那是一个不同的故事。这只是说,这些语句结束了一个开放的交易。

【讨论】:

太棒了!因此,用户无法看到第一次重命名已经完成但第二次重命名尚未完成的时刻,对吧? @FrozenHeart 是的,因为这是一个原子操作。

以上是关于如何在 MySQL 的一个原子操作中重命名两个表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MySQL 中重命名模式

在 Gitkraken 中重命名分支?

如何在 Bigtable 中重命名表?

在 MySQL 中重命名外键列

在 MySQL 中重命名外键列

详解MYSQL中重命名procedure的一种方法