[mysql] 무결성 제약 위반 : 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_projects1
FOREIGN 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_id에 있는지 확인하십시오fillableComment모델 속성에 .

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


답변

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


답변

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

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


답변

먼저 제약 조건 “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');


답변

컬럼에 대한 값 것을 의미 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)를 만들어야했습니다.