首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将复合键中的一列用作外键

问将复合键中的一列用作外键
EN

Stack Overflow用户
提问于 2016-06-29 08:58:56
回答 2查看 1.2K关注 0票数 2

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

代码语言:javascript
复制
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允许创建一个外键,它只引用主键中的第一列,而不引用第二列。这很奇怪吗?还是我太蠢了!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-06-29 09:06:23

作为MySQL在外键指示上的文档

InnoDB允许外键引用任何索引列或列组。但是,在引用的表中,必须有一个索引,其中引用的列按相同的顺序列为第一列。 NDB需要在作为外键引用的任何列上显式的唯一键(或主键)。

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

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2016-06-29 09:05:20

在FK关系中,应对子表和父表上的列进行索引。MySQL不能对第二列使用索引(在您的情况下是PK2)。因此,您需要在PK2上添加索引:

代码语言:javascript
复制
alter table TESTPARENT add key (PK2);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38094819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档