一尘不染

将组合键中的列之一用作外键

sql

我试图查看是否可以将组合键中的列之一用作外键。我得到了奇怪的结果。

CREATE TABLE TESTPARENT(
    PK1 INT,
    PK2 INT,
    PRIMARY KEY(PK1,PK2)
);

Query OK, 0 rows affected (0.01 sec)


CREATE TABLE TESTCHILD1(
    FK1 INT, 
    FOREIGN KEY (FK1) REFERENCES TESTPARENT(PK1)
);

Query OK, 0 rows affected (0.01 sec)


CREATE TABLE TESTCHILD2(
    FK2 INT,
    FOREIGN KEY (FK2) REFERENCES TESTPARENT(PK2)
);

ERROR 1005 (HY000): Can't create table 'test.TESTCHILD2' (errno: 150)

MySQL允许创建仅引用主键第一列而不引用第二列的外键。这奇怪吗?还是我很愚蠢!


阅读 228

收藏
2021-03-08

共1个答案

一尘不染

正如有关外键的MySQL文档所指出的那样

InnoDB允许外键引用任何索引列或列组。但是,在被引用的表中,必须有一个索引,其中被引用的列以相同的顺序列为第一列。

NDB在引用为外键的任何列上都需要一个显式的唯一键(或主键)。

因此,如果您使用innodb,则MySQL不允许您在不是索引最左边字段的字段上创建外键。

原因是在多列索引中,您不能基于不是最左边的字段来查找值,因此该索引不能用于快速查找外键检查的值。

MySQL索引的这种行为在有关多列索引的MySQL文档中进行了描述:

如果列不构成索引的最左前缀,则MySQL无法使用索引来执行查找。

2021-03-08