我收到此错误是因为我尝试将 INSERT 插入到表中,但外键没有其他条目可供引用,因为我试图在 MySQL Workbench 中建立递归关系。它看起来像这样:
是用户表和消息表的关系。
消息条目需要有一个 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 workbench 上同步时,约束被添加到数据库中,现在我不能在消息表上进行插入。
我该如何解决?
最佳答案
将 reply_to
的定义更改为可以具有 NULL
值的列:
reply_to INT(11) UNSIGNED,
当消息是第一条时(不回复另一条消息),将 NULL
插入到 reply_to
中。
sample SQL Fiddle
关于MySQL 递归关系阻止我进行插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33073741/