Laravel迁移报错:1068 Multiple primary key defined 求助
问题原因
你遇到的错误是因为迁移代码里同时定义了两组主键:
$table->id();会自动生成一个名为id的自增主键字段,这是Laravel的默认主键配置。- 后续你又通过
$table->primary(['userId', 'productId']);设置了联合主键,导致单表存在多个主键定义,触发SQL语法冲突。
解决方法
移除默认的自增主键$table->id();,保留联合主键即可,同时可以简化外键的定义写法:
public function up() { Schema::create('wishlists', function (Blueprint $table) { // 用户外键,简化写法 $table->foreignId('userId') ->constrained('users') ->onDelete('cascade'); // 商品外键,简化写法 $table->foreignId('productId') ->constrained('products') ->onDelete('cascade'); // 设置联合主键,确保同一用户对同一商品只能添加一次心愿单 $table->primary(['userId', 'productId']); $table->timestamps(); }); }
补充说明
- 联合主键
userId + productId可以保证同一条用户-商品组合不会重复插入,完全符合心愿单的业务逻辑。 foreignId()->constrained()是Laravel提供的简化语法,自动关联对应表的id字段,效果等价于你原来手动编写的foreign()->references()代码。
内容的提问来源于stack exchange,提问作者Mohammadreza Alagheband
相关产品推荐
相关产品推荐

