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

问题描述 投票:1回答:3

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

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

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

mysql schema migration views atomic
3个回答
5
投票

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

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

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


2
投票

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

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

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


0
投票

其他答案不正确。

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

请参阅文档here

© www.soinside.com 2019 - 2024. All rights reserved.