如何在 MySQL 中交换表?

Ben*_*Ben 61 mysql alter-table locking

假设,我有一个 table foo,其中包含一些不时计算的统计信息。它被其他查询大量使用。

这就是为什么我想计算更多最近的统计数据foo_new并在计算准备好时交换它们。

我可以

ALTER TABLE foo RENAME foo_tmp;
ALTER TABLE foo_new RENAME foo;
Run Code Online (Sandbox Code Playgroud)

但是如果在foo没有表的情况下查询需要这两行之间的表会发生foo什么?我想我必须以某种方式锁定它……或者还有其他方法可以做到吗?

Shl*_*ach 101

使用这个命令:

RENAME TABLE foo TO foo_old, foo_new To foo;
Run Code Online (Sandbox Code Playgroud)

这是一个原子操作:两个表都锁定在一起(并且锁定时间很短),因此任何访问都发生在RENAME.

  • 一个问题是,如果我有“tableX”,它的父约束引用了“foo”。在这个 RENAME 之后,它现在将引用 `foo_old` 但如果没有引用 `foo` 的约束,那么你应该没问题...... (6认同)
  • http://dev.mysql.com/doc/refman/5.5/en/rename-table.html (4认同)
  • 同样值得注意的是,RENAME TABLE 必须等待表上的现有查询完成,直到它可以被执行。这很好,但它也会在等待 RENAME 发生时锁定其他查询!这可能会导致您的数据库表严重锁定(对我们来说是这样)。这适用于innodb! (4认同)