我收到此错误是因为我尝试INSERT到一个表但外键没有其他条目要引用,因为我试图在MySQL工作台中建立递归关系。它看起来像这样:
这是用户表和消息表之间的关系。
消息条目需要有from_id
和to_id
才能知道谁发送给谁。那样就好。但后来我需要一个消息表上的递归关系,其中消息可以是对另一个消息的回复,但它不必是回复,因为第一个消息永远不能是对另一个消息的回复,因为它是第一个消息。因此,当我尝试插入此表时,我收到此错误:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`message`, CONSTRAINT `fk_message_message1` FOREIGN KEY (`reply_to`) REFERENCES `message` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION)
这是消息表:
CREATE TABLE IF NOT EXISTS `message` (
`id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '',
`message` TEXT NOT NULL COMMENT '',
`reply_to` INT(11) UNSIGNED NOT NULL DEFAULT '1' COMMENT '',
`from_id` INT(11) UNSIGNED NOT NULL COMMENT '',
`to_id` INT(11) UNSIGNED NOT NULL COMMENT '',
`is_active` INT(1) NOT NULL DEFAULT '1' COMMENT '',
`sent_time` INT(11) UNSIGNED NOT NULL COMMENT '',
`is_viewed` INT(1) NOT NULL DEFAULT '0' COMMENT '',
PRIMARY KEY (`id`) COMMENT '',
INDEX `from_id` (`from_id` ASC) COMMENT '',
INDEX `to_id` (`to_id` ASC) COMMENT '',
INDEX `sent_time` (`sent_time` ASC) COMMENT '',
INDEX `reply_to` (`reply_to` ASC) COMMENT '',
CONSTRAINT `fk_message_user1`
FOREIGN KEY (`from_id`)
REFERENCES `user` (`id`)
ON DELETE CASCADE
ON UPDATE NO ACTION,
CONSTRAINT `fk_message_user2`
FOREIGN KEY (`to_id`)
REFERENCES `user` (`id`)
ON DELETE CASCADE
ON UPDATE NO ACTION,
CONSTRAINT `fk_message_message1`
FOREIGN KEY (`reply_to`)
REFERENCES `message` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
现在我知道问题所在,但我没有解决方案。我希望能够使用递归关系对图片中显示的数据库进行建模。这样其他人就可以看到递归关系并理解它的存在。但是当我在Mysql工作台上进行同步时,约束会被添加到数据库中,现在我无法在消息表上进行插入。
我该如何解决这个问题?
答案 0 :(得分:0)
将reply_to
的定义更改为可以具有NULL
值的列:
reply_to INT(11) UNSIGNED,
当信息第一时(不回复其他信息),将NULL
插入reply_to
。