假设我有一个表foo,其中包含一些不时计算的统计信息。

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

我可以做

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


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

#1 楼

使用此命令:

RENAME TABLE foo TO foo_old, foo_new To foo;


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

评论


dev.mysql.com/doc/refman/5.5/en/rename-table.html

– Miracle173
2012年8月8日在22:45

这样的一个问题是,如果我有tableX并具有引用foo的父约束。在此重命名之后,它现在将引用foo_old,但是如果没有约束引用foo,那么您应该可以...

– Marcin Wasiluk
17年1月17日在11:23



@MarcinWasiluk-外键的另一个缺点。

–里克·詹姆斯(Rick James)
17年4月4日在20:32

同样值得一提的是,RENAME TABLE必须等待表上的现有查询完成才能执行。可以,但是在等待RENAME发生时,它也锁定了其他查询!这可能会严重锁定数据库表(对我们而言)。这适用于innodb!

–约翰·亨特
18年5月15日在10:17