Laravel迁移报错1061:重复键名问题的原因与解决
Laravel迁移重复索引错误:原因与解决
问题场景
执行以下Laravel迁移代码时触发SQL错误:
Schema::dropIfExists('personal_access_tokens'); Schema::create('personal_access_tokens', function (Blueprint $table) { $table->id(); $table->morphs('tokenable'); $table->string('name'); $table->string('token', 64)->unique(); $table->text('abilities')->nullable(); $table->timestamp('last_used_at')->nullable(); $table->timestamp('expires_at')->nullable(); $table->timestamps(); $table->index(['tokenable_type', 'tokenable_id']); });
错误信息:
SQLSTATE[42000]: Syntax error or access violation: 1061 Duplicate key name 'personal_access_tokens_tokenable_type_tokenable_id_index' (SQL: alter table
personal_access_tokensadd indexpersonal_access_tokens_tokenable_type_tokenable_id_index(tokenable_type,tokenable_id))
问题原因
$table->morphs('tokenable')是Laravel提供的快捷方法,它会自动完成两项核心操作:
- 创建
tokenable_type(字符串类型)和tokenable_id(无符号整数类型)两个字段 - 自动生成这两个字段的联合索引,索引名称就是报错信息里的
personal_access_tokens_tokenable_type_tokenable_id_index
你手动添加的$table->index(['tokenable_type', 'tokenable_id']);会尝试创建完全相同的索引,导致数据库触发重复键名的冲突错误。
解决方法
直接删除迁移代码中手动添加索引的那一行即可:
修改后的完整迁移代码:
Schema::dropIfExists('personal_access_tokens'); Schema::create('personal_access_tokens', function (Blueprint $table) { $table->id(); $table->morphs('tokenable'); $table->string('name'); $table->string('token', 64)->unique(); $table->text('abilities')->nullable(); $table->timestamp('last_used_at')->nullable(); $table->timestamp('expires_at')->nullable(); $table->timestamps(); });
之后重新执行迁移命令就能正常完成表创建:
php artisan migrate
内容的提问来源于stack exchange,提问作者sunil yadav
相关产品推荐
相关产品推荐

