Mysql 如何在两个表都已创建的cast中交换表名?

Mysql 如何在两个表都已创建的cast中交换表名?,mysql,Mysql,假设我们有两个表new和current(都是innodb)。 我们应该自动截断当前的表内容,并用新的表中的新内容填充 可能的方式: 交换表名重命名表,但这没有帮助,因为两个表都已创建 启动交易;截断当前表格;插入当前从新建中选择;提交事务-这是可以的,但是有可能以跨国家的方式进行所有这些操作吗 动态创建第三个表,并像桥梁一样使用它 最佳做法是什么 UPD:我想这会很好地工作:将表current重命名为xxx,new重命名为current;xxx到新的将当前重命名为临时,然后将新的重命名为当前

假设我们有两个表
new
current
(都是innodb)。 我们应该自动截断
当前的
表内容,并用
新的
表中的新内容填充

可能的方式:

  • 交换表名
    重命名表
    ,但这没有帮助,因为两个表都已创建
  • 启动交易;截断
    当前
    表格;插入
    当前
    新建
    中选择;提交事务-这是可以的,但是有可能以跨国家的方式进行所有这些操作吗
  • 动态创建第三个表,并像桥梁一样使用它
最佳做法是什么


UPD:我想这会很好地工作:
将表current重命名为xxx,new重命名为current;xxx到新的

将当前重命名为临时,然后将新的重命名为当前和上次创建表格新表格并删除临时表格

首先,您需要确保当前表格不应被锁定

如果我们有两个表表1表2

RENAME TABLE table1 TO table1_temp;
RENAME TABLE table2 TO table1;
RENAME TABLE table1_temp TO table2;

试试这个。这肯定会对您有所帮助。

您需要使用单个MySQL语句重命名表,以便将其作为单个MySQL原子操作执行,否则,在不同名称之间交换表时,您可能会导致程序尝试访问其中一个表时出错

但听起来您还需要“new”表为空,以便在操作结束时接受新记录

CREATE TABLE new_empty LIKE new;
RENAME TABLE current TO old, new to current, new_empty TO new;
DROP TABLE old;
这比执行“truncate current”和“insert into current select*from new”更有效,因为您不复制任何记录,它只创建一个新表结构(及其索引),重命名三个文件并删除旧表(通过从数据库目录中删除这两个文件)


首先有两张桌子的原因是什么还有,你在这里说的是多少数据?@Steve,不要太多数据。大约50-100K行,5-10个整型字段。
将当前表重命名为xxx,将新表重命名为当前表;xxx TO new
这样,对吗?您想截断当前值,然后只需再次创建新表并删除tempRENAME table current TO xxx,new TO current;创建新表;它不会是原子的。因此,在第一次重命名之后,没有表1。您的应用程序将开始失败。第二次重命名后,没有表2。更多问题。我想你应该试试,这会有用的。我在MYSQL 5.6中运行这些查询后编写了这篇文章,非常简单。因此,请在对任何评论进行评级之前至少尝试一次。