当前位置: 首页 > 面试题库 >

将组合键中的列之一用作外键

璩俊雅
2023-03-14
问题内容

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

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,则MySQL不允许您在不是索引最左边字段的字段上创建外键。

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

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

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



 类似资料:
  • 它应该允许独立地更新表,并在父行被删除时删除子行。

  • 我有两个表,一个有复合主键,另一个有外键。它们都设置为删除时级联。问题是,当我从主表中删除一个复合键集“name:John date:02.02.2018”时,所有John行都会从带有外键的表中删除,但是可以有一个集合“name:John date:04.04.2018”以及日期为02.02的所有行。也删除了一些行,如何才能使其删除仅匹配外键集的行? 更新:

  • 问题内容: 如何使用复合主键作为外键?看来我的尝试无效。 问题答案: 该行: 是错的。您不能那样使用,这只是父表中PK约束的名称。要将复合主键用作外键,您必须向子表中添加相同数量(组成PK)的相同数据类型的列,然后在定义中使用这些列的组合:

  • 如何将复合主键用作外键?看来我的尝试没有成功。

  • 问题内容: 这是我的两个关注表: 我想在“组”中创建一个字段,该字段将链接到“教程”中的复合唯一键。所以我想我的问题是,如何关联这些表?我必须为“教程”中的每个主键在“组”中创建外键字段吗? 问题答案: 根据mySQL文档,您应该能够设置到组合的外键映射,这将要求您创建多个列。 添加列并将其放在表格中 正如史蒂文(Steven)在以下注释中提到的那样,您应该尝试重新构造它,以便教程表使用实际的主键

  • 问题内容: 一个表的外键是否可以成为另一个表的组合主键的一部分?例如,如果我有两个表,一个包含有关不同用户的所有活动项目的信息,另一个包含有关项目正在使用哪种设备的信息: 项目表: (两者都不是唯一的) 设备表: (两者都不是唯一的) 现在可以将设备表中的ProjectId设置为项目表中的外键吗?尝试时,我收到一条错误消息,指出“项目表”中的列与现有的主键或唯一约束不匹配? 问题答案: 不。 创建