复合外键由父表中的部分主键组成

时间:2017-03-04 13:53:49

标签: mysql sql foreign-keys ddl composite-key

我有以下父表:

create table A(
  a int(64) unsigned not null,
  b set('a', 'b', 'c') not null default '',
  c set('d', 'e') not null default '',
  primary key ( a,b,c)
)

孩子:

create table B(
  d int(64) unsigned not null auto_increment,
  a int(64) unsigned not null,
  c set('d', 'e') not null default '',
  primary key (d),
  key fk1 (a,c),
  constraint fk1 foreign key (a, c) references (a, c)
)

但是我在mysql日志中创建子表时遇到了fk错误:

  

表外键(a,c)引用的外键约束出错   A(a,c):在引用的表中找不到索引   引用的列显示为第一列或列中的列类型   table和引用的表与约束不匹配。

我的SQL有什么不对?

1 个答案:

答案 0 :(得分:2)

当您定义外键时,MySQL要求远程表中的列存在索引,以便它可以有效地执行约束检查。

它可以是精确引用列的索引,也可以是以引用列开头的索引,之后包含其他列,所以在您的情况下,表A应该有一个带有列(a,c)的索引,并且可能是一些其他

现在,在表A中,列集(a,b,c)上有一个索引。 请注意,列的顺序很重要,(a,b,c)上的索引与(a,c,b)中的索引不同。

FK引用列(a,c)。表A中没有这些列的索引,或者以这两个列开头并且在此之后包含更多列的任何其他索引。

所以你有两个选择:

  1. 将表A中的PK修改为(a,c,b)而不是(a,b,c)。注意 在某些情况下,这可能会对您的性能产​​生影响 查询,因为其中一些可能无法使用索引。
  2. 在A中为这两列添加额外的索引:

    ALTER TABLE A
      添加索引tempindexac);