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

时间:2015-10-12 05:20:03

标签: mysql database-design

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

enter image description here

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

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

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

reply_to INT(11) UNSIGNED,

当信息第一时(不回复其他信息),将NULL插入reply_to

SQL Fiddle

上的示例