使用SQL脚本和事务管理mysql架构更改

使用SQL脚本和事务管理mysql架构更改,mysql,transactions,rollback,Mysql,Transactions,Rollback,我在PHP/MySQL应用程序中使用多个数据库。我有开发、测试、登台和生产数据库保持同步 目前我们还在构建这个东西,所以很容易保持它们的同步。我使用我的dev数据库作为主数据库,当我想更新其他数据库时,我只需将它们核化,然后从我的数据库中重新创建它们。然而,将来一旦有了真实的数据,我就不能这样做了 我希望将SQL脚本编写为文本文件,可以使用svn中伴随的PHP更改对其进行版本化,然后在更新它们时将脚本应用于每个db实例 我希望使用事务,以便在脚本期间如果出现任何错误,它将回滚所做的任何部分更改。

我在PHP/MySQL应用程序中使用多个数据库。我有开发、测试、登台和生产数据库保持同步

目前我们还在构建这个东西,所以很容易保持它们的同步。我使用我的dev数据库作为主数据库,当我想更新其他数据库时,我只需将它们核化,然后从我的数据库中重新创建它们。然而,将来一旦有了真实的数据,我就不能这样做了

我希望将SQL脚本编写为文本文件,可以使用svn中伴随的PHP更改对其进行版本化,然后在更新它们时将脚本应用于每个db实例

我希望使用事务,以便在脚本期间如果出现任何错误,它将回滚所做的任何部分更改。所有表都是InnoDB

当我尝试添加一个已经存在的列,并添加一个新列时,如下所示:

SET FOREIGN_KEY_CHECKS = 0;
START TRANSACTION;
ALTER TABLE `projects` ADD COLUMN `foo1` varchar(255) NOT NULL after `address2`;
ALTER TABLE `projects` ADD COLUMN `foo2` varchar(255) NOT NULL after `address2`;
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;
。。。当然,它仍然提交新列,尽管它未能添加第一列,因为我发布了COMMIT而不是ROLLBACK

我需要它在出错时有条件地发出rollback命令。如何在临时SQL脚本中执行此操作

我知道存储过程的“declare exit handler”特性,但我不想存储它;我只想把它作为一个临时脚本运行

为了获得条件回滚,我是否需要将其放入存储过程中,或者是否有另一种方法使整个事务在单个临时SQL脚本中原子化

欢迎链接到示例-我已经在谷歌上搜索过了,但到目前为止我只找到了存储过程示例

非常感谢

伊恩


编辑-这永远不会起作用;ALTER TABLE在遇到时会导致隐式提交:多亏了Brian的提醒

我前几天了解到,MySQL中总是对数据定义语言语句进行操作,并在应用它们时提交事务。我认为,如果你想确保成功,你可能必须以互动的方式这样做

我在这个网站上找不到这个问题,讨论的地方(那是几天前)


如果需要使多个数据库保持同步,可以研究复制。虽然复制不可小看,但它可能是您所需要的。请参见

嗨,布莱恩,谢谢你提供的关于DDL的提示——这确实隐约敲响了某种警钟。。。如果我发现了什么,我会检查并更新问题。复制绝对不是这里的答案。。。作为开发工作流程的一部分,这些副本意味着每个副本在不同的时间点具有不同的数据和模式。