3

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

可能的方式:

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

最佳做法是什么?

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

4

3 回答 3

5

您需要使用单个 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 new”要高效得多,因为您不复制任何记录,它只会创建一个新的表结构(及其索引),重命名三个文件并删除旧表(通过从数据库目录中删除两个文件)。

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

于 2017-11-20T21:05:28.280 回答
0

将 current 重命名为 temp 然后 new 为 current 和 last create table new one and drop temp table

于 2013-03-20T10:47:46.087 回答
-3

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

如果我们有两个表table1table2

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

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

于 2017-06-29T08:28:45.663 回答