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

Posted

技术标签:

【中文标题】SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败 - Laravel【英文标题】:SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails - Laravel 【发布时间】:2014-01-09 10:17:37 【问题描述】:

我知道这个问题已经被问过了,但我仍然找不到我做错了什么。

我正在使用框架 Laravel。

我有 2 个表(用户和位置)。当我想创建一个用户时,我收到错误消息:

SQLSTATE[23000]:违反完整性约束:1452 无法添加或 更新子行:外键约束失败 (festival_aid.users,约束fk_users_locations1外键 (location_id) 参考文献locations (location_id) 删除 CASCADE ON UPDATE NO ACTION) (SQL: insert into users (user_id, user_email, location_id) 值 (?, ?, ?)) (绑定: 数组 (0 => '1', 1 => 'test@hotmail.com', 2 => '1', ))

表用户

CREATE TABLE IF NOT EXISTS `festival_aid`.`users` (
  `user_id` BIGINT NOT NULL AUTO_INCREMENT,
  `user_email` VARCHAR(45) NOT NULL,
  `user_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `user_modified` TIMESTAMP NULL,
  `user_deleted` TIMESTAMP NULL,
  `user_lastlogin` TIMESTAMP NULL,
  `user_locked` TIMESTAMP NULL,
  `location_id` BIGINT NOT NULL,
  PRIMARY KEY (`user_id`),
  UNIQUE INDEX `user_email_UNIQUE` (`user_email` ASC),
  CONSTRAINT `fk_users_locations1`
    FOREIGN KEY (`location_id`)
    REFERENCES `festival_aid`.`locations` (`location_id`)
    ON DELETE CASCADE
    ON UPDATE NO ACTION,
ENGINE = InnoDB;

餐桌位置

DROP TABLE IF EXISTS `festival_aid`.`locations` ;

CREATE TABLE IF NOT EXISTS `festival_aid`.`locations` (
  `location_id` BIGINT NOT NULL AUTO_INCREMENT,
  `location_latitude` FLOAT NOT NULL,
  `location_longitude` FLOAT NOT NULL,
  `location_desc` VARCHAR(255) NULL,
  `location_type` VARCHAR(45) NULL,
  PRIMARY KEY (`location_id`))
ENGINE = InnoDB;

迁移用户

public function up()
    
        Schema::table('users', function(Blueprint $table)
        
            $table->increments('user_id');
            $table->string('user_email');
            $table->timestamp('user_created');
            $table->timestamp('user_modified');
            $table->timestamp('user_deleted');
            $table->timestamp('user_lastlogin');
            $table->timestamp('user_locked');

            $table->foreign('location_id')
                ->references('id')->on('locations');
            //->onDelete('cascade');
        );
    

迁移地点

public function up()
    
        Schema::table('locations', function(Blueprint $table)
        
            $table->primary('location_id');
            $table->float('location_latitude');
            $table->float('location_longitude');
            $table->string('location_desc');
            $table->string('location_type');
        );
    

模型用户

public function location()
    
        return $this->belongsTo('Location');
    

模型位置

 public function user()
    
        return $this->hasOne('User');
    

控制器

public function store()
    
        $input = Input::all();

        $rules = array('user_email' => 'required|unique:users|email');

        $v = Validator::make($input, $rules);

        if($v->passes())
        
            $user = new User();
            $location = new Location();

            $user->user_email = $input['user_email'];
            //$user->location_id = $input['location_id'];

            $location->location_latitude = $input['location_latitude'];
            $location->location_longitude = $input['location_longitude'];

            $user->save();
            $location->save();
    

我似乎找不到我做错了什么。显然外键有问题。

【问题讨论】:

【参考方案1】:

用户行需要对有效位置的引用。 在保存用户之前,该位置必须可用。 因此,首先保存位置,然后保存用户并取消注释 $user->location_id 行,您就完成了。

【讨论】:

这很奇怪,但在我的情况下,我在插入之前确实在约束表中有行,但它仍然会抛出这个错误。【参考方案2】:

遇到此错误的开发者:

SQLSTATE[23000]:违反完整性约束:1452 无法添加或更新子行: 外键约束失败 (laravel.articles, CONSTRAINT articles_user_id_foreign FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE) (SQL: 插入articles (title, user_id, body, updated_at, created_at) 值 (rao, 1, sflkkjk, 2016-03-01 20:45:32, 2016- 03-01 20:45:32)) SQLSTATE[23000]:违反完整性约束:1452 无法添加或更新子行: 外键约束失败 (laravel.articles, CONSTRAINT articles_user_id_foreign FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE) (SQL: 插入articles (title, user_id, body, updated_at, created_at) 值 (rao, 1, sflkkjk, 2016-03-01 20:45:32, 2016- 03-01 20:45:32))

先保存用户的用户记录,然后尝试插入记录,然后轻松插入数据库。

关键点

两个表:一个是文章,另一个是用户。一个用户有很多文章,但没有文章有很多用户。所以外键向文章表移动。如果用户表没有记录,那么您将面临前面看到的相同错误。

这样我们就可以轻松解决这个问题了。

【讨论】:

以上是关于SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败 - Laravel的主要内容,如果未能解决你的问题,请参考以下文章

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

Innobyte 插件问题:SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行

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

Laravel:正确保存后返回重定向抛出 SQLSTATE [23000]:完整性约束违规

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

Laravel 7 错误 - SQLSTATE [23000]:完整性约束违规:1048 列 'first_name' 不能为空