1

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

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

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

4

3 回答 3

5

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

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

如果您查看 mysql 的错误库,您可以在这方面找到一些错误。

于 2008-11-29T00:23:02.817 回答
2

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

您也许可以使用 LOCK TABLES 锁定表,但我怀疑您一旦重命名表就会失去锁定!LOCK DATABASE 可能会起作用,但很可能需要所有其他客户端在您的锁定请求被授予之前完全断开连接。

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

于 2009-02-09T19:51:56.183 回答
1

其他答案不正确。

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

在此处查看文档

于 2016-03-18T07:57:52.020 回答