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