外键可以引用非唯一索引吗?

all*_*ode 39 mysql sql foreign-keys

我认为一个外键意味着一行必须引用一行,但我正在看一些表肯定不是这样的表.Table1的column1在table2中的column2上有一个外键约束,但是table2中有许多记录在column2中有相同的值.column2上还有非唯一索引.这是什么意思?外键约束是否只是意味着在右列中必须存在至少一个具有正确值的记录?我认为这意味着必须有一个这样的记录(不确定空白如何适应图片,但我现在不太关心它).

更新:显然,这种行为是特定于MySQL,这是我正在使用的,但我没有在我原来的问题中提到它.

Hob*_*bes 44

来自MySQL文档:

InnoDB允许外键约束引用非唯一键.这是标准SQL的InnoDB扩展.

但是,有一个实际的理由要避免在引用表的非唯一列上使用外键.也就是说,在这种情况下,"ON DELETE CASCADE"的语义应该是什么?

文件进一步建议:

对非唯一键或包含NULL值的键的外键引用的处理没有很好地定义(...)建议您使用仅引用UNIQUE(包括PRIMARY)和NOT NULL键的外键.

  • MySQL的5.1版文档更进一步:"处理对非唯一键[sic]或包含NULL值的键的外键引用没有很好地定义....建议使用仅引用UNIQUE和NOT NULL键的外键. " (2认同)

cha*_*aos 7

你的分析是正确的; 键不必是唯一的,约束将作用于匹配的行集.通常不是一种有用的行为,但情况可能出现在你想要的地方.

  • 您对外键的理解完全搞砸了,因为这是一个虚假的答案。即使您找到了可以执行此操作的数据库(我没有测试 MySQL),实现这种外键关系也会非常非常糟糕的数据库设计。 (3认同)
  • @cdonner:嗯,我会认为*正确*会对我的回答是'伪造'有所帮助.我应该做什么,撒谎告诉你不能这样做的人因为我认为这是一个坏主意(我这样做)?是的,你可以在mysql中做到这一点. (3认同)