完整性约束违规:1452无法添加或更新子行:

num*_*l25 63 mysql sql

我试图在我的评论表中插入值,我收到一个错误.它说我无法添加或更新子行,我不知道这意味着什么.

我的架构看起来像这样

-- ----------------------------
-- 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');
Run Code Online (Sandbox Code Playgroud)

我试图做的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')
Run Code Online (Sandbox Code Playgroud)

我得到的错误看起来像这样

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)

Joh*_*Woo 90

它只是意味着您要插入的project_id表上的列的值在表comments上不存在projects.请记住,列的值project_id上表comments是依赖于值IDProjects.

表中不存在50dc845a-83e4-4db3-8705-5432ae7aaee3您为列插入的值.project_idprojects

  • 如果我在那张桌子里有价值怎么办?我有相同的错误,但我有表和ID匹配的值. (20认同)
  • 我有一个类似的问题。从表中删除旧数据解决了我的问题。 (4认同)
  • Yojan,我们应该删除哪个表,“父”还是“子”(依赖)表? (3认同)

Jyo*_*thu 34

确保您拥有模型project_idfillable属性Comment.

我有同样的问题,这就是原因.

  • 同样在这里,使用Laravel.很好的抓住. (7认同)

Pra*_*ahu 12

如果您向现有表添加新外键并且列不为空且未分配默认值,您将收到此错误,

要么你需要使它nullable或者assign default value,或者delete all the existing records解决它。

  • 使列可为空解决了问题 (3认同)

tya*_*yan 5

还要确保您添加的外键与原始列的类型相同,如果您引用的列不是同一类型,它也会失败。


小智 5

我希望我的决定会有所帮助。我在 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');
    ...
    });
Run Code Online (Sandbox Code Playgroud)

请注意上面的 on('comments') 函数。正确的代码

 $table->foreign('post_id')->references('id')->on('posts')->onDelete('cascade');
Run Code Online (Sandbox Code Playgroud)


Cod*_*ife 5

这意味着,对于列中的值project_id上表中comments要插入不仅doesn't exist在表的项目project_id可能没有默认值。例如,在我的情况下,我将其设置为 NULL。

对于 Laravel,您可以将此表达式视为迁移 php 文件的一段代码,例如:

class ForeinToPhotosFromUsers extends Migration
Run Code Online (Sandbox Code Playgroud)

{ /** * 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');
});
}
Run Code Online (Sandbox Code Playgroud)

}

显然,您必须在所有这些旁边创建 Model 类(在我的例子中是 Photo)。