如何在已创建两个表的情况下交换表名?

4
假设我们有两个表格newcurrent(都是innodb)。我们应该原子地截断current表的内容,并用new表中的新内容填充它。
可能的方法:
  • 交换表名RENAME TABLE,但这无济于事,因为这两个表已经创建了
  • 开始事务;清空current表;插入到current中选择new的内容;提交事务——可以,但是否可能以事务方式执行所有这些操作?
  • 即时创建第三张表,并将其用作桥梁
最佳实践是什么?
更新:我认为这将完美地运行:RENAME TABLE current TO xxx, new TO current; xxx TO new

首先,为什么要有两个表呢?此外,你说的数据量有多大? - Steve
@Steve,不要太多数据。大约50-100K行的5-10个整数字段。 - Kirzilla
3个回答

6

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

但是,似乎您还需要将“新”表清空,以便在操作结束时接受新记录。

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

这比执行“截断当前表”和“插入新表中的所有内容”更有效率,因为它不会复制任何记录,只创建一个新的表结构(包括其索引),重命名三个文件并删除旧表(通过从数据库目录中删除两个文件)。 https://dev.mysql.com/doc/refman/5.7/en/rename-table.html

0
将当前表重命名为temp,然后将新表重命名为当前表,最后创建一个名为new的新表并删除temp表。

1
这样更改表名,对吧?将当前表名更改为xxx,将新表名更改为当前表名,将xxx更改为新表名。 - Kirzilla
如果您想截断当前的右侧,只需创建一个新表并删除临时表即可。 - shola
重命名表 current 为 xxx,new 为 current;创建表 new;删除 temp。 - shola

-4

首先,您需要确保当前表未被锁定。

如果我们有两个表table1table2

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

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


3
这不是原子操作。因此,在第一次重命名后,就没有table1了。您的应用程序将开始失败。在第二次重命名后,就没有table2了。更多问题。 - Richard A Quadling
我认为你应该尝试一下,这会起作用的。我在运行MYSQL 5.6中的这些查询后编写了这篇文章,它非常简单。因此,请在评价任何评论之前至少尝试一次。 - Ajai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接