同一个表上的外键约束

mat*_*ang 4 mysql foreign-key

我有一个这样的表结构。

tblquestion
(
  nQuestionId1 INT UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT_NULL,
  nQuestionId2 INT UNSIGNED ALLOW NULL
);
Run Code Online (Sandbox Code Playgroud)

这里.. nQuestionId2 对同一个表上的 nQuestionId1 有一个外键约束,即 tblquestion。

所以..在恢复备份时,我在 nQuestionId2 上收到一些外键警告和错误..那么,是因为外键引用了同一个表列吗?

这种类型的表结构会进一步产生任何问题吗?

谢谢

Wor*_*DBA 5

如果您还原包含在值的行,你会得到错误nQuestionId2引用一个值nQuestionId1还没有被创建。

有几种方法可以解决此问题:

  • 您可以确保以正确的顺序创建数据。
  • 您可以在导入数据之前禁用外键,然后再重新启用它们。
  • 如果禁用/重新启用不是一个选项,您可以删除/重新创建它们。
  • 或者,您可以拆分数据,以便nQuestionId1位于单独的表中 - 这将允许您首先恢复所有nQuestionId1值。

我想,但问题实际上是关于您想要实现的目标。

我见过这样的设计,它有一个ID列,然后是一个引用IDPARENT列。为了获得根父级,您必须递归遍历您正在查看的对象的所有父级。这意味着即使这样的设计在逻辑上可能有意义,查询它也可能变得非常困难。

数据库设计不仅仅是将业务规则和对象映射到表和约束,还要考虑什么是可维护的,设计将如何承受大量数据,以及对您的方法务实。

我希望这可以帮助你。