我试图看看是否可以使用复合键中的一列作为外键。我得到了奇怪的结果。
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 文档外键表示 https://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html:
InnoDB 允许外键引用任何索引列或列组。但是,在引用的表中,必须有一个索引,其中引用的列以相同的顺序列为第一列。
NDB 要求任何列上有显式唯一键(或主键)
作为外键引用。
所以,如果你使用innodb,那么MySQL不允许你在不是索引最左边字段的字段上创建外键。
原因是在多列索引中,您无法根据非最左边的字段查找值,因此索引不能用于快速查找外键检查的值。
MySQL 索引的这种行为在 MySQL 文档中进行了描述多列索引 http://dev.mysql.com/doc/refman/5.7/en/multiple-column-indexes.html:
如果列不构成索引的最左边前缀,MySQL 就无法使用索引来执行查找。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)