Я работаю с несколькими базами данных в приложении PHP / MySQL.У меня есть базы данных для разработки, тестирования, промежуточной и производственной базы данных.
В настоящее время мы все еще строим эту штуку, поэтому их легко синхронизировать.Я использую свою базу данных dev в качестве мастера, и когда я хочу обновить другие, я просто уничтожаю их и воссоздаю их из своей.Однако в будущем, когда появятся реальные данные, я не смогу это сделать.
Я хотел бы написать сценарии SQL в виде текстовых файлов, которые я могу создавать версии с изменениями PHP, которые сопровождают их в SVN, а затем применять сценарии к каждому экземпляру БД по мере их обновления.
Iхотел бы использовать транзакции, чтобы в случае возникновения ошибок во время выполнения сценария он откатывал все внесенные частичные изменения.Все таблицы 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.
Мне нужно, чтобы он выдал команду отката условно при ошибке.Как я могу сделать это в специальном SQL-скрипте?
Мне известна функция «объявить обработчик выхода» хранимых процедур, но я не хочу хранить это;Я просто хочу запустить его как сценарий adhoc.
Нужно ли в любом случае превращать его в хранимый процесс, чтобы получить условные откаты, или есть другой способ сделать всю транзакцию атомарной в одном режиме?SQL-скрипт?
Любые ссылки на примеры приветствуются - я гуглил, но пока нахожу только сохраненные примеры процессов
Большое спасибо
Ian
EDIT- это никогда не сработает;ALTER TABLE вызывает неявную фиксацию при обнаружении: http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html Спасибо Брайану за напоминание