完整性约束违规: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,CONSTRAINT categories_id_foreign FOREIGN KEY (id) REFERENCES tfc_post_category (cat_id) ON DELETE CASCADE) (SQL: insert into tfc_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_categorycat_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 迁移中的外键约束失败

SQL 错误:SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败

SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败 - Laravel