2013-03-20 35 views
1

假设我们有两个表newcurrent(都是innodb)。 我们应该自动截断current表内容并填写new表中的新内容。如何交换两个表已创建的转换表名称?

可能方式:

  • 交换表名RENAME TABLE,但它不能帮助,因为这两个表已创建
  • 开始交易;截断表current表;插入currentnew中选择;提交事务 - 没关系,但是能否以跨行的方式进行所有这些操作?
  • 创建飞第三个表,并使用它像一座桥梁

什么是最好的做法是什么?

UPD:我想这将很好地工作:RENAME TABLE current TO xxx, new TO current; xxx TO new

+0

有两张桌子摆在首位的原因是什么? - 你在这里还谈论了多少数据? – Steve 2013-03-20 10:49:56

+0

@Steve,数据不是太多。大约50-100K行的5-10个int字段。 – Kirzilla 2013-03-20 10:52:11

回答

0

将现有的以温度,然后新的当前和过去的创建表的新的和删除临时表

+1

'RENAME TABLE当前TO xxx,新TO当前; xxx以新的方式,对吧? – Kirzilla 2013-03-20 10:55:12

+0

你想截断当前的权利,然后再简单地创建新的表并删除温度 – shola 2013-03-20 10:57:30

+0

RENAME TABLE当前TO xxx,新的TO当前;创建表新;降温 – shola 2013-03-20 11:01:06

-2

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

如果我们有两个表table1中表2

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

试试这个。这将明确帮助你。

+1

这不会是原子的。所以,第一次重命名后,没有table1。你的应用程序将开始失败。第二次重命名后,没有table2。更多问题。 – 2017-08-02 10:03:53

+0

我认为你应该尝试,这将起作用。我在MYSQL 5.6中运行这些查询后编写它,它非常简单。所以,请在评论任何评论之前至少尝试一次。 – Ajai 2017-08-03 10:07:02

0

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

但它也听起来像你需要“新”表为空以接受操作结束时的新记录。

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

这比做一个更有效的“截断电流”和“插入到当前SELECT * FROM新”,是因为你没有复制任何记录,只创建一个新的表结构(其索引),重命名三个文件并删除旧表(通过删除数据库目录中的两个文件)。

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