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

标签 mysql database-design

我收到此错误是因为我尝试将 INSERT 插入到表中,但外键没有其他条目可供引用,因为我试图在 MySQL Workbench 中建立递归关系。它看起来像这样:

enter image description here

是用户表和消息表的关系。

消息条目需要有一个 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/

相关文章:

mysql - 在 MySQL 中将 NULL 结果包含为 0

mysql - Yii 框架和 HAS_ONE 与数百万行的关系

mysql - 如何使用表中不同数量的列来设计数据库

mysql 字符串包含在搜索字符串中

php - 在多个表中搜索记录并在 mysql 和 php 中以不同的方式打印输出

php - 组织这种结构的最佳方式?

mysql - 我应该聚合吗?这是一个明智的做法吗?

MySQL 错误 1241 : Operand should contain 1 column(s) on insert statement (no selects)

mysql - 如何正确跟踪记录变更和变更作者

c# - 从 DbSet<TEntity> 中获取属性值在 IEnumerable 中的所有实体