2013-12-20 78 views
7

我知道这个问题已经被问到,但我仍然无法找到我在做什么错误。SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败 - Laravel

我正在使用框架Laravel。

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

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (festival_aid . users , CONSTRAINT fk_users_locations1 FOREIGN KEY (location_id) REFERENCES locations (location_id) ON DELETE CASCADE ON UPDATE NO ACTION) (SQL: insert into users (user_id , user_email , location_id) values (?, ?, ?)) (Bindings: array (0 => '1', 1 => '[email protected]', 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(); 
    } 

我似乎无法找到我在做什么错。显然外键有问题。

回答

11

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

+7

这很奇怪,但在我的情况下,我在插入之前在约束表中有行,但它仍然会抛出此错误。 –

0

谁面对这样的错误那些开发:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row:
a foreign key constraint fails (laravel . articles , CONSTRAINT articles_user_id_foreign FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE)
(SQL: insert into articles (title , user_id , body , updated_at , created_at) values (rao, 1, sflkkjk, 2016-03-01 20:45:32, 2016-03-01 20:45:32))
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row:
a foreign key constraint fails (laravel . articles , CONSTRAINT articles_user_id_foreign FOREIGN KEY (user_id) REFERENCES users (id) ON DELETE CASCADE)
(SQL: insert into articles (title , user_id , body , updated_at , created_at) values (rao, 1, sflkkjk, 2016-03-01 20:45:32, 2016-03-01 20:45:32))

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

KEY POINT

两个表:一个是文章和其他由用户。用户有很多文章,但没有文章有很多用户。所以外键转向了文章列表。如果用户表没有记录,那么你将面临同样的错误。

通过这样做,我们可以轻松解决这个问题。

相关问题