Ну во первых в safeDown нужно прописать обратные действия к safeUp. Тоесть если не вышел safeUp то делаешь safeDown и он убирает все те теблицы и ключи которые создались… Дабы при повторном UPe ошибок небыло…
Ну миграция, как по мне, отилчно сделана. Если вдруг в saveUp была ошибка и миграция не дошла до конца но всеже таблица уже создалась то делаешь migration down и все. Ну или на крайний случай, в saveUp, перед созданием таблицы, можешь проверить, есть ли она в БД, сделав это так:
if (Yii::app()->db->schema->getTable($tableName,true)===null) {
// table does not exist
} else {
// table exists
}
Понял. Ну в принципе проблема скорее всего в том, что по факту миграции не расчитаны на "глупо написанные" запросы ну и ошибки не связанные напрямую с БД. Поэтому в ветке разраюотки такое конечно можно допускать но чистить руками прийдется. А вот в ветку продакшена желательно кидать миграции которые пройдут нормально)