使用组合键中的一列作为外键

时间:2016-06-29 08:58:57

标签: mysql sql foreign-keys primary-key composite-key

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

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允许创建仅引用主键中第一列但不引用第二列的外键。这有点奇怪吗?或者我是傻瓜!

2 个答案:

答案 0 :(得分:1)

在FK关系中,应该对子表和父表上的列建立索引。 MySQL无法在第二列上使用索引(在您的情况下为PK2)。 所以你需要在PK2上添加索引:

alter table TESTPARENT add key (PK2);

答案 1 :(得分:1)

作为foreign keys indicates上的MySQL文档:

  

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

     

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

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

原因是在多列索引中,您无法根据不是最左侧的字段查找值,因此索引不能用于快速查找外键检查的值。

MySQL索引的这种行为在multi-column indexes上的MySQL文档中描述:

  

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