51 假设我有一个表foo,其中包含不时计算的一些统计信息。其他查询大量使用它。 这就是为什么我要在其中计算更多最新统计信息foo_new并在计算准备就绪时交换它们。 我可以做 ALTER TABLE foo RENAME foo_tmp; ALTER TABLE foo_new RENAME foo; 但是,如果在foo没有表的情况下查询需要在这两行之间有表,该foo怎么办?我想我必须以某种方式锁定它...还是有另一种方法可以锁定它? mysql locking alter-table — 本 source
79 使用此命令: RENAME TABLE foo TO foo_old, foo_new To foo; 这是一个原子操作:两个表都锁定在一起(并且锁定时间很短),因此任何访问都发生在之前或之后RENAME。 — Shlomi Noach source 4 dev.mysql.com/doc/refman/5.5/en/rename-table.html — miracle173 2 这个问题是,如果我有tableX父约束引用foo。重命名之后,现在将进行引用,foo_old但是如果没有约束引用, foo那么您应该可以... — Marcin Wasiluk @MarcinWasiluk-的另一个缺点FOREIGN KEYs。 — 里克·詹姆斯 2 同样值得一提的是,RENAME TABLE必须等待表上的现有查询完成才能执行。可以,但是在等待RENAME发生时,它也锁定了其他查询!这可能会严重锁定数据库表(对我们而言)。这适用于innodb! — 约翰·亨特