我可以自动重命名/替换2个或更多表和视图吗?

时间:2008-11-29 00:18:39

标签: mysql schema migration views atomic

给定一个表X和一个视图Y(与X具有相同的结构)是否有办法将X重命名为Z,将Y重命名为X,这样任何查询都不会看到任何名为X的内容?重命名X并创建视图也是有效的。

作为模式迁移计划的一部分,重点是将旧表替换为新版本中模拟旧版本的视图,以便两组客户端代码可以同时运行。

MySQL是我的选择,但其他人的信息也很有用。

3 个答案:

答案 0 :(得分:5)

这在postgres中是微不足道的,在mysql中是不可能的。

mysql免除了来自事务的模式修改。我有一个postgres背景,所以这是一个显而易见的事情(开始一个事务,做一些事情,提交或回滚 - postgres并不挑剔“做一些事情”)。

如果你查看mysql的bug基础,你可以找到一些bug。

答案 1 :(得分:2)

MySQL与Oracle一样,将大多数DDL语句(CREATE TABLE,ALTER TABLE等)视为导致“隐式提交”。您无法使用事务模型保护其他连接不会看到您的DDL更改。 (我相信Postgres在这方面很不寻常。)

您可以使用LOCK TABLES锁定表格,但我怀疑您在重命名表格后会立即丢失锁定! LOCK DATABASE可能有效,但可能需要所有其他客户端在授予锁定请求之前完全断开连接。

当然,这会导致其他客户端在重命名表时阻塞,这可能是一种廉价的操作。

答案 2 :(得分:0)

其他答案不正确。

您可以通过在重命名语句中列出多个表来原子地重命名一堆表。

请参阅文档here