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

Mysql 我可以自动重命名/替换2个或更多的表和视图吗?,mysql,schema,migration,views,atomic,Mysql,Schema,Migration,Views,Atomic,给定一个表X和一个视图Y(与X具有相同的结构),有没有一种方法可以将X原子地重命名为Z,将Y原子地重命名为X,这样任何查询都不会看到任何名为X的内容?重命名X和创建视图也是有效的 要点是,作为模式迁移计划的一部分,使用模拟新版本的旧版本的视图替换旧表,以便两组客户端代码可以同时运行 MySQL是我的选择,但其他信息也会很有用。这在postgres中是微不足道的,在MySQL中是不可能的 mysql从事务中免除模式修改。我有postgres的背景,所以这是一件显而易见的事情(开始事务、做一些事情、

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

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


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

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

mysql从事务中免除模式修改。我有postgres的背景,所以这是一件显而易见的事情(开始事务、做一些事情、提交或回滚——postgres对什么是“做一些事情”并不挑剔)


如果你仔细查看mysql的bug库,你会发现一些bug。

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

mysql从事务中免除模式修改。我有postgres的背景,所以这是一件显而易见的事情(开始事务、做一些事情、提交或回滚——postgres对什么是“做一些事情”并不挑剔)


如果查看mysql的bug库,您会发现一些bug。

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

您可能可以使用lock tables锁定表,但我怀疑一旦重命名表,您就会丢失锁!锁数据库可能工作,但可能需要所有其他客户端在您的锁请求被授予之前完全断开连接


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

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

您可能可以使用lock tables锁定表,但我怀疑一旦重命名表,您就会丢失锁!锁数据库可能工作,但可能需要所有其他客户端在您的锁请求被授予之前完全断开连接


当然,在重命名表时,这会导致其他客户机阻塞,这可能是一种成本较低的操作。

其他答案不正确

通过在rename语句中列出多个表,可以原子地重命名一组表


参见文档

其他答案不正确

通过在rename语句中列出多个表,可以原子地重命名一组表


请参阅文档

我不知道参考资料--它只是实现了我的期望。好了,在postgres中唯一不能回滚的就是truncate(即,您可以删除并创建)。试一下,看看它是否也能达到你的预期。不知道引用——它只是达到了我的预期。好了,在postgres中唯一不能回滚的就是truncate(即,您可以删除并创建)。试试看它是否也能达到你的预期。