
在 Yii 1.x 中,需使用 alterColumn() 方法而非重复 addColumn() 来变更已有字段的数据类型;必须同时实现 up() 和 down() 方法以确保迁移可逆,并注意数据库兼容性与数据迁移风险。
在 yii 1.x 中,需使用 `altercolumn()` 方法而非重复 `addcolumn()` 来变更已有字段的数据类型;必须同时实现 `up()` 和 `down()` 方法以确保迁移可逆,并注意数据库兼容性与数据迁移风险。
在 Yii 1.x 应用中,当已通过迁移添加了某列(如 running_hours),后续发现原始数据类型(如 DECIMAL(4,2))无法满足业务需求(例如实际值超出范围或需存储带单位的字符串),不能直接调用 addColumn() 再次创建同名列——这会导致 SQL 错误(列已存在)。正确做法是使用 alterColumn() 方法来修改现有列的定义。
✅ 正确迁移写法(Yii 1.x)
class m240510_120000_alter_running_hours_column extends CDbMigration
{
public function up($migration)
{
// 将 asset 表中的 running_hours 列从 DECIMAL(4,2) 改为 VARCHAR(8)
$this->alterColumn('asset', 'running_hours', 'VARCHAR(8)');
}
public function down($migration)
{
// 回滚:恢复为原始类型(注意:此操作可能丢失精度或引发数据截断,需谨慎)
$this->alterColumn('asset', 'running_hours', 'DECIMAL(4,2)');
}
}
⚠️ 重要注意事项:
- alterColumn() 是 Yii 1.x CDbMigration 提供的原生方法,底层调用对应数据库的 ALTER COLUMN(MySQL 为 MODIFY COLUMN 或 CHANGE COLUMN,具体由 DBMS 驱动自动适配)。
- 数据兼容性风险:将数值型(DECIMAL)转为字符串型(VARCHAR)通常安全(数值可无损转为字符串),但反向操作(VARCHAR → DECIMAL)可能失败——若字段中已存非数字内容(如 "N/A"、"123.45h"),回滚将报错。建议在 down() 中添加数据校验或注释警告。
- 执行前务必备份:运行迁移前,对生产数据库执行完整备份;可在测试环境先行验证迁移效果。
- 确认表名与列名准确:Yii 不做元数据校验,拼写错误将导致 SQL 异常。
- 若需保留原有数值并追加单位(如 "123.45h"),建议在应用层处理格式化,数据库仍保持 DECIMAL 并新增描述字段,而非粗暴转 VARCHAR。
完成迁移文件后,通过命令行执行:
yiic migrate up
即可生效。迁移记录将自动写入 tbl_migration 表,支持版本追踪与回滚。











