我试图查看是否可以将组合键中的列之一用作外键。我得到了奇怪的结果。
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允许创建仅引用主键第一列而不引用第二列的外键。这奇怪吗?还是我很愚蠢!
正如有关外键的MySQL文档所指出的那样:
InnoDB允许外键引用任何索引列或列组。但是,在被引用的表中,必须有一个索引,其中被引用的列以相同的顺序列为第一列。 NDB在引用为外键的任何列上都需要一个显式的唯一键(或主键)。
InnoDB允许外键引用任何索引列或列组。但是,在被引用的表中,必须有一个索引,其中被引用的列以相同的顺序列为第一列。
NDB在引用为外键的任何列上都需要一个显式的唯一键(或主键)。
因此,如果您使用innodb,则MySQL不允许您在不是索引最左边字段的字段上创建外键。
原因是在多列索引中,您不能基于不是最左边的字段来查找值,因此该索引不能用于快速查找外键检查的值。
MySQL索引的这种行为在有关多列索引的MySQL文档中进行了描述:
如果列不构成索引的最左前缀,则MySQL无法使用索引来执行查找。