我收到此错误的原因是,我尝试插入表中,但是外键没有其他条目要引用,因为我试图在MySQL工作台中建立递归关系。看起来像这样:

mysql - MySQL递归关系阻止我进行插入-LMLPHP

它是用户表和消息表之间的关系。

消息条目需要具有from_idto_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工作台上进行同步时,该约束被添加到数据库中,现在我无法在消息表上进行插入。

我该如何解决?

最佳答案

reply_to的定义更改为可以具有NULL值的列:

reply_to INT(11) UNSIGNED,


第一次出现消息时,将NULL插入reply_to(不回复其他消息)。

SQL Fiddle上采样

关于mysql - MySQL递归关系阻止我进行插入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33073741/

10-16 15:17