由 parent table 中的部分主键组成的复合外键

Composite foreign key made up of part of primary key in parent table

我有以下 parent table:

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)
)

和child:

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 日志中创建 child table 时遇到 fk 错误:

Error in foreign key constraint of table Foreign key (a,c) references A (a,c): Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint.

我的 SQL 有什么问题?

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

它可以是引用列上的索引,也可以是从引用列开始,然后包含其他列的索引,因此在您的情况下,table A 应该有一个包含列的索引 (a ,c) 和可能的其他一些。

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

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

所以你有两个选择:

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

    改变TABLEA
    添加索引 tempindex (a, c);