如何在MySQL中交换表?


51

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

这就是为什么我要在其中计算更多最新统计信息foo_new并在计算准备就绪时交换它们。

我可以做

ALTER TABLE foo RENAME foo_tmp;
ALTER TABLE foo_new RENAME foo;

但是,如果在foo没有表的情况下查询需要在这两行之间有表,该foo怎么办?我想我必须以某种方式锁定它...还是有另一种方法可以锁定它?

Answers:


79

使用此命令:

RENAME TABLE foo TO foo_old, foo_new To foo;

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



2
这个问题是,如果我有tableX父约束引用foo。重命名之后,现在将进行引用,foo_old但是如果没有约束引用, foo那么您应该可以...
Marcin Wasiluk

@MarcinWasiluk-的另一个缺点FOREIGN KEYs
里克·詹姆斯

2
同样值得一提的是,RENAME TABLE必须等待表上的现有查询完成才能执行。可以,但是在等待RENAME发生时,它也锁定了其他查询!这可能会严重锁定数据库表(对我们而言)。这适用于innodb!
约翰·亨特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.