You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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_tokens add index personal_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 04:55:19