完整性约束违规:1452 无法添加或更新子行:外键约束失败(Laravel 应用程序)
Posted
技术标签:
【中文标题】完整性约束违规:1452 无法添加或更新子行:外键约束失败(Laravel 应用程序)【英文标题】:Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (Laravel Application) 【发布时间】:2017-07-17 04:03:53 【问题描述】:我的 laravel 应用程序出现此错误。
这些是表格:
发帖
Schema::create('posts', function (Blueprint $table)
$table->increments('id');
$table->string('title');
$table->text('content');
$table->timestamps();
$table->integer('user_id')->unsigned();
);
类别
Schema::create('categories', function (Blueprint $table)
$table->increments('id');
$table->string('name');
$table->timestamps();
);
Post_Category
Schema::create('post_category', function (Blueprint $table)
$table->integer('post_id')->unsigned()->unique()->nullable();
$table->integer('cat_id')->unsigned()->unique()->nullable();
$table->timestamps();
);
外键
Schema::table('posts', function (Blueprint $table)
$table->foreign('id')->references('post_id')->on('post_category')->onDelete('cascade');
);
Schema::table('categories', function (Blueprint $table)
$table->foreign('id')->references('cat_id')->on('post_category')->onDelete('cascade');
);
这是我的模型
class Categorie extends Model
protected $table = 'categories';
public function posts()
return $this->hasMany('App\PostCategory');
...
class Post extends Model
public function author()
return $this->belongsTo('App\User', 'user_id');
public function featuredImage()
return $this->belongsTo('App\Media', 'media_id');
public function categories()
return $this->hasMany('App\PostCategory');
...
class PostCategory extends Model
protected $table = 'post_category';
这里是控制器
店铺分类:
public function store(StoreCategory $request)
$category = new Categorie;
$category->name = $request->input('name');
$category->save();
return redirect('/admin/categories')->with('status', 'New category created!');
商店帖子
public function store(StorePost $request)
$post = new Post;
$post->title = $request->input('title');
$post->content = $request->input('content');
$post->media_id = $request->input('media_id');
$post->user_id = $request->input('user_id');
$post->save();
return redirect('/admin/posts')->with('status', 'New post created!');
有这个错误
SQLSTATE[23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败(
the_film_corner
.tfc_categories
,CONSTRAINTcategories_id_foreign
FOREIGN KEY (id
) REFERENCEStfc_post_category
(cat_id
) ON DELETE CASCADE) (SQL: insert intotfc_categories
(name
,updated_at
,created_at
) 值 (News, 2017-02-26 14:51:15, 2017-02-26 14:51:15))
谢谢
【问题讨论】:
【参考方案1】:你在错误的表中添加了外键:
Schema::table('post_category', function(Blueprint $table)
$table->foreign('post_id')->references('id')->on('post')->onDelete('cascade');
$table->foreign('category_id')->references('id')->on('category')->onDelete('cascade');
);
那么……
class Categorie extends Model
protected $table = 'categories';
public function posts()
return $this->belongsToMany('App\Category');
// Or more specifically
return $this->belongsToMany('App\Category', 'post_category', 'id', 'post_id');
class Post extends Model
// ...
public function categories()
return $this->belongsToMany('App\Category');
// Or more specifically
return $this->belongsToMany('App\Category', 'post_category', 'id', 'category_id');
您可以在 Laravel 官方指南中找到更多信息:
https://laravel.com/docs/5.4/eloquent-relationships#one-to-many
【讨论】:
感谢 Samuele 的帮助。【参考方案2】:错误说明了一切。使用此设置,在将行插入tfc_categories
之前,id
列的值必须存在于表tfc_post_category
的cat_id
列中。如果不是,则您违反了失败消息中提到的约束。
但我猜你希望一列引用另一列,反之亦然。
【讨论】:
单独解释理论并不是很有用,对解决方案的描述将极大地帮助您回答问题。我读了你的解释,我发现很难理解,因为提问者有很多代码,这并没有引用问题的答案,只是对正在发生的事情的解释。解释理论非常有用,请不要误会我的意思,但通过示例会更有帮助,不仅对提问者而且对问题的未来观众都有帮助。 解决方案显然是在tfc_post_category
中添加一条记录,并首先使用相应的id
。
不,不是很明显,如果很明显,她/他就不会问这个问题。你只是重申了这个错误,你几乎没有扩展它的含义。提问者详细列出了所有内容,因为他遇到了一个错误,而且解决方案不是“显而易见的”。
请允许我自己引用:“...在将行插入tfc_categories
之前,id
列的值必须存在于cat_id
列中表tfc_post_category
”。这就是建议的解决方案。以上是关于完整性约束违规:1452 无法添加或更新子行:外键约束失败(Laravel 应用程序)的主要内容,如果未能解决你的问题,请参考以下文章
SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败
完整性约束违规:1452 无法添加或更新子行:外键约束失败(Laravel 应用程序)
SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败 - Laravel
:完整性约束违规:1452 无法添加或更新子行:laravel 迁移中的外键约束失败