programing

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

goodsources 2022. 11. 10. 20:54
반응형

무결성 제약 조건 위반: 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 , 제 , , , ,fk_comments_projects1 키Foreign Key)project_idprojects )id NO ACTION의 경우

컬럼의 project_idcomments하는 것은 projects은 . 의 . . . . 。project_idcomments는 의 달라집니다.IDProjects.

50dc845a-83e4-4db3-8705-5432ae7aaee3에 .project_id에는 존재하지 않습니다.projects.

있어야 합니다.project_id fillable Commentmodel.model.model.models

저도 같은 문제가 있었고, 그게 이유였어요.

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

중 하나를 .nullable ★★★★★★★★★★★★★★★★★」assign default value , 「」delete all the existing records해결할 수 있습니다.

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

제 결정이 도움이 되기를 바랍니다.라라벨에서도 비슷한 오류가 있었어요.이치노
다음 중 하나:

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');

, 컬럼 값 ", " " " " 가 됩니다.project_idcomments삽입하는 것뿐만 아니라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)를 만들어야 했습니다.

먼저 제약 조건 "fk_comments_projects1"과 해당 인덱스를 삭제합니다.그 후 다시 만듭니다.

테이블을 올바른 순서로 작성 및 채우지 않은 경우에도 이 오류가 발생합니다.들어 스키마에 에는 Comments가 필요합니다.user_id,project_id,task_id ★★★★★★★★★★★★★★★★★」data_type_id ,,Users 「」,Projects 「」,Task과 '''Data_Type테이블 ID 또는 다른 열을 참조하려면 테이블이 이미 종료되어 있고 테이블 내에 값이 있어야 합니다.

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

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);
    }
}

이렇게 해서 비슷한 문제를 해결했습니다.

테이블 내에 de FK를 작성하는 행이 몇 개 있을 수 있습니다.

Foreign_key_checks OFF를 사용하여 마이그레이션을 실행합니다.콘텐츠 테이블에 대응하는 id 필드가 있는 레코드만 삽입합니다.

이 문제는 추가하려는 project_id가 있는 데이터베이스에 프로젝트 레코드가 없기 때문일 수 있습니다.

만약 누군가가 라라벨을 사용하다가 이 문제가 발생할 경우.이것도 받고 있었는데, 문제는 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);
    }
}

제가 실수로 제 아이 기록에서 잘못된 "유체"를 사용했을 때 이런 문제가 생겼습니다.이 경우 제약조건은 링크가 올바른지 확인하기 위해 하위 레코드에서 상위 레코드로 이동합니다.수동으로 생성 중이었는데, 이미 모델이 자동으로 실행되도록 조정되어 있었습니다.그래서 내 해결책은:

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

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

$parent->uuid

도움이 됐으면 좋겠다.

저도 같은 오류가 있었습니다.문제는 추가하려고 했던 것입니다.role_idusers, 단, " ", ''role_id기본값이 없기 때문에 DB는 사용자가 몇 명 있고 사용자가 열을 추가하는 방법을 모르기 때문에 열을 삽입할 수 없도록 했습니다. 에 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★migrate:fresh 실제 중인 을 「 」, 「 」, 「 」, 「 」로했을 가능성이 있습니다role_idDB에서 해당 역할을 가질 때까지 제한을 받지 않도록 해야 합니다.

프라이머리 키의 값과 일치하지 않는 외부 키 값을 삽입하고 있을 수 있습니다.

제 경우 모델 이름 중 하나에 공백을 두었기 때문에 작동하지 않았습니다.

이미지

외국인 키가 죽은 엔트리로 테이블을 채웠어요테이블을 청소하고 나서, 나는 새로운 제약을 추가할 수 있었다.

DELETE FROM `table_with_bad_entries` WHERE `expected_foreign_key` not in (select `id` from `the_referenced_table`);

테이블을 삭제한 후 다시 Import를 했더니 작동했어요.부모테이블(사용자)을 삭제하고 다시 작성하면 자녀테이블(좋아요)이 부모테이블(사용자)에 대한 외부키를 가지고 있기 때문입니다.

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

반응형