Yii2执行数据库迁移时提示表已存在错误是什么原因?
错误原因
你对Yii2迁移的运行逻辑确实存在理解偏差,操作上有三处明显错误:
- 已经完成应用的迁移文件禁止修改。Yii2迁移采用单向增量变更的设计逻辑,每个迁移文件对应一次数据库操作,系统会自动在
migration系统表中记录所有已执行成功的迁移文件名,已提交、已执行过的迁移文件修改后不会重新触发执行,还会导致多环境结构不一致。 - 本地手动修改数据库结构的操作没有生成对应的增量迁移记录。你手动给
job表新增test字段的操作,仅存在于你的本地数据库,没有对应的迁移文件同步给同事,其他人的数据库默认不会同步这个变更。 console/yii migration/update job不是Yii2官方默认的迁移命令,大概率是第三方扩展提供的能力,你本地执行后没有生成可同步的增量迁移文件,仅修改了本地的表结构和旧迁移文件。
同事执行报错的直接原因是:他的数据库中已经存在job表,但系统migration表中没有m211012_201641_01_create_table_job的执行记录,执行迁移时会尝试重新运行这个创建表的迁移,触发表已存在的报错。
正确操作流程
后续需要给已存在的表新增字段时,按以下流程操作即可:
- 执行命令创建新的增量迁移文件:
console/yii migrate/create add_test_column_to_job_table
- 打开新生成的迁移文件,补充操作逻辑:
public function up() { $this->addColumn('{{%job}}', 'test', $this->integer()); } public function down() { $this->dropColumn('{{%job}}', 'test'); }
- 本地执行
console/yii migrate测试迁移正常运行后,将新生成的迁移文件提交给同事,同事执行同样的migrate命令即可完成字段同步。
当前问题临时修复方案
- 如果同事的
job表中无需要保留的数据:让他手动删除数据库中的job表,重新执行console/yii migrate即可正常运行你修改后的创建表迁移,生成带test字段的表。 - 如果同事的
job表中有需要保留的数据:让他手动给job表添加test字段,再将m211012_201641_01_create_table_job的记录手动插入到migration系统表中,避免后续重复执行该迁移。
内容的提问来源于stack exchange,提问作者Hunter Bertoson
相关产品推荐
相关产品推荐

