我有以下父表:
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有什么不对?
答案 0 :(得分:2)
当您定义外键时,MySQL要求远程表中的列存在索引,以便它可以有效地执行约束检查。
它可以是精确引用列的索引,也可以是以引用列开头的索引,之后包含其他列,所以在您的情况下,表A应该有一个带有列(a,c)的索引,并且可能是一些其他
现在,在表A中,列集(a,b,c)上有一个索引。 请注意,列的顺序很重要,(a,b,c)上的索引与(a,c,b)中的索引不同。
FK引用列(a,c)。表A中没有这些列的索引,或者以这两个列开头并且在此之后包含更多列的任何其他索引。
所以你有两个选择:
在A中为这两列添加额外的索引:
ALTER TABLE A
添加索引tempindex
(a
,c
);