我以为外键意味着一行必须引用一行,但我正在查看一些表,其中肯定不是这样.表1中的column1在表2中的column2上具有外键约束,但表2中有许多记录在column2中具有相同的值.第2列也有非唯一索引.这是什么意思?外键约束是否仅仅意味着至少有一条记录必须在正确的列中具有正确的值?我认为这意味着必须有一个这样的记录(不确定空值如何与图片匹配,但我现在不太担心).

更新:显然,这种行为是MySQL特有的,这就是我使用的,但我在最初的问题中没有提到.

推荐答案

MySQL documentation开始:

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

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

The documentation further advises:

对非唯一键或包含空值的键的外键引用的处理没有得到很好的定义(…)建议您使用只引用唯一键(包括主键)而非空键的外键.

Mysql相关问答推荐

无条件理解MySQL中内连接和交叉连接的相似性

将值代入子查询

如何计算超过特定数字的所有不同ID组,然后返回这些ID?

如何在MySQL中检索两列的值不同的行

为什么MySQL不考虑在联接中使用(JSON)函数索引,而考虑在生成的列上使用索引?

为什么我的带有索引字段和非索引字段的 Select 有时需要很长时间

数组上的MySQL、JSON_CONTAINS用法

在MySQL CLI中,是否有自动完成过程的方法?

在MySQL中使用FIRST_VALUE()

MySQL Group by或Distinct in Window函数

查找同时玩过这两种游戏的玩家

INNER JOIN 问题(MySQL 错误代码:1054)

使用 MySQL 在树中查找 Leaf

如何根据特定条件从mysql数据库中 Select 查询

更改整数时间到日期格式 MM/DD/YY,如 python 中的 datetime.fromtimestamp

MySQL Workbench - 如何同步 EER 图

在 MySQL 中检测 utf8 损坏的字符

MySQL 整数与日期时间索引

NodeJS/mySQL - ER_ACCESS_DENIED_ERROR 用户'root'@'localhost'的访问被拒绝(使用密码:是)

如何通过一个语句描述数据库中的所有表?