如何在两个表已经创建的转换中交换表名?

时间:2013-03-20 10:41:01

标签: mysql

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

可能的方法:

  • 交换表名RENAME TABLE,但它无法帮助,因为两个表都已创建
  • 开始交易;截断current表;插入current选择new;提交事务 - 没关系,但是有可能以交易方式进行所有这些操作吗?
  • 在第三张桌子上创建并像桥梁一样使用它

最佳做法是什么?

UPD:我认为这将完美运作:RENAME TABLE current TO xxx, new TO current; xxx TO new

3 个答案:

答案 0 :(得分:0)

将当前重命名为temp,然后将new重命名为current和last create table new one并删除临时表

答案 1 :(得分:0)

您需要使用单个MySQL语句重命名表,以便将其作为单个mysql原子操作执行,否则可能会导致尝试访问其中一个表的程序发生错误,同时将它们交换为各种名字。

但听起来你也需要"新的" table为空以在操作结束时接受新记录。

CREATE TABLE new_empty LIKE new;
RENAME TABLE current TO old, new to current, new_empty TO new;
DROP TABLE old;

这比做"截断当前"更有效率。 "插入当前select * from new"因为你不复制任何记录,它只会创建一个新的表结构(带有索引),重命名三个文件并删除旧表(通过删除数据库目录中的两个文件)。

https://dev.mysql.com/doc/refman/5.7/en/rename-table.html

答案 2 :(得分:-2)

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

如果我们有两个表 table1 table2

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

试试这个。这肯定会帮助你。