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


84

주석 테이블에 값을 삽입하려고하는데 오류가 발생합니다. 내가 자식 행을 추가하거나 업데이트 할 수 없다는 말은 그것이 무엇을 의미하는지 전혀 모릅니다.

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

-- ----------------------------
-- 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_projects1 FOREIGN KEY ( project_id) REFERENCES projects( id) ON DELETE NO ACTION ON UPDATE NO ACTION)

답변:


123

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

50dc845a-83e4-4db3-8705-5432ae7aaee3column에 삽입 하는 값 이 project_idtable에 존재하지 않습니다 projects.


25
내가 그 테이블에 가치가 있다면? 동일한 오류가 있지만 테이블 및 ID 일치에 값이 있습니다.
Sergey Romanov

4
비슷한 문제가 있었는데 테이블에서 이전 데이터를 삭제하면 문제가 해결되었습니다.
Yojan

2
Yojan, "부모"또는 "자식"(종속) 테이블을 삭제해야합니까?
Peanuts

46

당신이 project_id에 있는지 확인하십시오fillableComment모델 속성에 .

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


8
Laravel을 사용하여 여기에서도 동일합니다. 좋은 캐치.
PapaHotelPapa

8

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


5

기존 테이블에 새 외래 키를 추가하고 열이 null이 아니고 기본값이 할당되지 않은 경우이 오류가 발생합니다.

당신은 그것을 만들 nullable거나 assign default value또는 delete all the existing records그것을 해결해야합니다.


4

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


4

내 결정이 도움이되기를 바랍니다. 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');

4

컬럼에 대한 값 것을 의미 project_id테이블에가 comments당신이뿐만 아니라 삽입하는 doesn't exist테이블 프로젝트를 하지만 또한 project_id아마 기본값이 없습니다 . 예를 들어 제 경우에는 NULL로 설정했습니다.

Laravel의 경우이 표현식을 마이그레이션 php 파일의 코드 덩어리로 간주 할 수 있습니다. 예를 들면 다음과 같습니다.

class ForeinToPhotosFromUsers extends Migration

{ /** * Run the migrations. * * @return void */

public function up()
{
    Schema::table('users', function (Blueprint $table) {
    $table->unsignedBigInteger('photo_id')->nullable();// ! ! ! THIS STRING ! ! !
    $table->foreign('photo_id')->references('id')->on('photos');
});
}

}

분명히이 모든 것 옆에 Model 클래스 (제 경우에는 Photo)를 만들어야했습니다.


3

올바른 순서로 테이블을 작성하고 채우지 않은 경우에도이 오류가 발생합니다. 예를 들어 스키마에 따라 Comments 테이블 user_idproject_id, task_iddata_type_id. 즉, Users테이블, Projects테이블, Task테이블 및 Data_Type테이블 은 이미 종료되었고 값이 있어야합니다. 하며 해당 ID 또는 다른 열을 참조하기 전에 .

Laravel에서 이것은 올바른 순서로 데이터베이스 시더를 호출하는 것을 의미합니다.

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(UserSeeder::class);
        $this->call(ProjectSeeder::class);
        $this->call(TaskSeeder::class);
        $this->call(DataTypeSeeder::class);
        $this->call(CommentSeeder::class);
    }
}

이것은 비슷한 문제를 해결 한 방법이었습니다.


2

누군가가 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);
    }
}

2

FK를 만들려는 테이블에 행이있을 수 있습니다.

foreign_key_checks OFF로 마이그레이션을 실행하십시오. 목차 테이블에 해당 ID 필드가있는 레코드 만 삽입하십시오.


1

내 자녀 기록에서 실수로 잘못된 "uuid"를 사용했을 때이 문제가 발생했습니다. 이 경우 제약 조건은 링크가 올바른지 확인하기 위해 하위 레코드에서 상위 레코드를 찾습니다. 이미 자동으로 수행하도록 모델을 리깅했을 때 수동으로 생성했습니다. 그래서 내 수정은 다음과 같습니다.

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

그런 다음 자식 클래스를 호출하여 자식을 삽입 할 때 다음 var 값을 전달했습니다.

$parent->uuid

도움이되기를 바랍니다.


0

같은 오류가 발생했습니다. 문제는 테이블 에 role_id외부 항목 을 추가하려고 users했지만 role_id기본값이 없었기 때문에 이미 일부 사용자가 있었기 때문에 DB에서 열 삽입을 허용하지 않았습니다. 열을 추가하는 방법을 알고 있습니다. 개발 중이기 때문에 방금을 사용 migrate:fresh했지만 프로덕션 중이라면 role_idDB에서 해당 역할을 가질 때까지 기본값을로 설정하고 제한하지 않을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.