IT TIP

무결성 제약 위반 : 1452 하위 행을 추가하거나 업데이트 할 수 없습니다.

itqueen 2020. 12. 3. 21:33
반응형

무결성 제약 위반 : 1452 하위 행을 추가하거나 업데이트 할 수 없습니다.


주석 테이블에 값을 삽입하려고하는데 오류가 발생합니다. 내가 자식 행을 추가하거나 업데이트 할 수 없다는 말은 그게 무슨 뜻인지 모르겠습니다.

내 스키마는 다음과 같습니다.

-- ----------------------------
-- Table structure for `comments`
-- ----------------------------
DROP TABLE IF EXISTS `comments`;
CREATE TABLE `comments` (
  `id` varchar(36) NOT NULL,
  `project_id` varchar(36) NOT NULL,
  `user_id` varchar(36) NOT NULL,
  `task_id` varchar(36) NOT NULL,
  `data_type_id` varchar(36) NOT NULL,
  `data_path` varchar(255) DEFAULT NULL,
  `message` longtext,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_comments_users` (`user_id`),
  KEY `fk_comments_projects1` (`project_id`),
  KEY `fk_comments_data_types1` (`data_type_id`),
  CONSTRAINT `fk_comments_data_types1` FOREIGN KEY (`data_type_id`) REFERENCES `data_types` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_comments_projects1` FOREIGN KEY (`project_id`) REFERENCES `projects` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `fk_comments_users` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf32;

-- ----------------------------
-- Records of comments
-- ----------------------------

-- ----------------------------
-- Table structure for `projects`
-- ----------------------------
DROP TABLE IF EXISTS `projects`;
CREATE TABLE `projects` (
  `id` varchar(36) NOT NULL,
  `user_id` varchar(36) NOT NULL,
  `title` varchar(45) DEFAULT NULL,
  `description` longtext,
  `created` datetime DEFAULT NULL,
  `modified` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_projects_users1` (`user_id`),
  CONSTRAINT `fk_projects_users1` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf32;

-- ----------------------------
-- Records of projects
-- ----------------------------
INSERT INTO `projects` VALUES ('50dcbc72-3410-4596-8b71-0e80ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', 'Brand New Project', 'This is a brand new project', '2012-12-27 15:24:02', '2012-12-27 15:24:02');

그리고 내가하려는 mysql 문은 다음과 같습니다.

INSERT INTO `anthonyl_fbpj`.`comments` (`project_id`, `user_id`, `task_id`, `data_type_id`, `message`, `modified`, `created`, `id`) 
VALUES ('50dc845a-83e4-4db3-8705-5432ae7aaee3', '50dcbc5c-d684-40bf-9715-0becae7aaee3', '1', '50d32e5c-abdc-491a-a0ef-25d84e9f49a8', 'this is a test', '2012-12-27 19:20:46', '2012-12-27 19:20:46', '50dcf3ee-8bf4-4685-aa45-4eb4ae7aaee3')

내가 얻는 오류는 다음과 같습니다.

SQLSTATE [23000] : 무결성 제약 조건 위반 : 1452 자식 행을 추가하거나 업데이트 할 수 없습니다. 외래 키 제약 조건이 실패합니다 ( anthonyl_fbpj. comments, CONSTRAINT fk_comments_projects1FOREIGN KEY ( project_id) REFERENCES projects( id) ON DELETE NO ACTION ON UPDATE NO ACTION)


단순히 삽입 하려는 project_id테이블의 열 값이 table에 comments존재하지 않음을 의미합니다 projects. project_idtable 의 column comments값은 IDon table 의 값에 따라 달라집니다 Projects.

50dc845a-83e4-4db3-8705-5432ae7aaee3column에 삽입 하는 값 project_idtable에 없습니다 projects.


모델 project_idfillable속성에 있는지 확인하십시오 Comment.

나는 똑같은 문제가 있었고 이것이 그 이유였습니다.


또한 추가하는 외래 키가 원래 열과 동일한 유형인지 확인하십시오. 참조하는 열이 동일한 유형이 아니면 실패합니다.


누군가가 Laravel을 사용하고 있으며이 문제가 발생하는 경우. 나는 이것도 얻고 있었고 문제는 피벗 테이블에 ID (즉, 외래 키)를 삽입하는 순서였습니다.

구체적으로 아래에서 다 대다 관계에 대한 예를 찾으십시오.

wordtokens <-> wordtoken_wordchunk <-> wordchunks

// wordtoken_wordchunk table
Schema::create('wordtoken_wordchunk', function(Blueprint $table) {
        $table->integer('wordtoken_id')->unsigned();
        $table->integer('wordchunk_id')->unsigned();

        $table->foreign('wordtoken_id')->references('id')->on('word_tokens')->onDelete('cascade');
        $table->foreign('wordchunk_id')->references('id')->on('wordchunks')->onDelete('cascade');

        $table->primary(['wordtoken_id', 'wordchunk_id']);
    });

// wordchunks table
Schema::create('wordchunks', function (Blueprint $table) {
        $table->increments('id');
        $table->timestamps();
        $table->string('text');
    });

// wordtokens table
Schema::create('word_tokens', function (Blueprint $table) {
        $table->increments('id');
        $table->string('text');
});

이제 내 모델은 다음과 같습니다.

class WordToken extends Model
{
   public function wordchunks() {
      return $this->belongsToMany('App\Wordchunk');
   }
}

class Wordchunk extends Model
{

    public function wordTokens() {
        return $this->belongsToMany('App\WordToken', 'wordtoken_wordchunk', 'wordchunk_id', 'wordtoken_id');
    }
}

Wordchunk 모델에서 'wordchunk_id'와 'wordtoken_id'의 순서를 교환하여 문제를 해결했습니다.

코드 완성을 위해 모델을 유지하는 방법은 다음과 같습니다.

private function persistChunks($chunks) {
    foreach ($chunks as $chunk) {
        $model = new Wordchunk();
        $model->text = implode(' ', array_map(function($token) {return $token->text;}, $chunk));
        $tokenIds = array_map(function($token) {return $token->id;}, $chunk);
        $model->save();
        $model->wordTokens()->attach($tokenIds);
    }
}

먼저 제약 조건 "fk_comments_projects1"과 해당 인덱스를 삭제합니다. 그 후에 그것을 다시 만드십시오.


내 결정이 도움이되기를 바랍니다. Laravel에서도 비슷한 오류가 발생했습니다. 잘못된 테이블에 외래 키를 추가했습니다.
잘못된 코드:

Schema::create('comments', function (Blueprint $table) {
$table->unsignedBigInteger('post_id')->index()->nullable();
...
$table->foreign('post_id')->references('id')->on('comments')->onDelete('cascade');
    });


Schema::create('posts', function (Blueprint $table) {
    $table->bigIncrements('id');
    ...
    });

위의 ( 'comments') 기능에 유의하십시오. 올바른 코드

 $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');

I had this issue when I was accidentally using the WRONG "uuid" in my child record. When that happens the constraint looks from the child to the parent record to ensure that the link is correct. I was generating it manually, when I had already rigged my Model to do it automatically. So my fix was:

$parent = Parent:create($recData); // asssigning autogenerated uuid into $parent

Then when I called my child class to insert children, I passed this var value:

$parent->uuid

Hope that helps.


Maybe you have some rows in the table that you want to create de FK.

Run the migration with foreign_key_checks OFF Insert only those records that have corresponding id field in contents table.

참고URL : https://stackoverflow.com/questions/14063652/integrity-constraint-violation-1452-cannot-add-or-update-a-child-row

반응형