我试图看看是否可以将复合键中的一列用作外键。我得到了奇怪的结果。
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允许创建仅引用主键中第一列但不引用第二列的外键。这有点奇怪吗?或者我是傻瓜!
答案 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无法使用索引执行查找。