gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 06:04:31 25 4
gpt4 key购买 nike

我有以下父表:

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 日志中创建子表时遇到 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 要求远程表中的列存在索引,以便它可以高效地执行约束检查。

它可以是引用列的索引,也可以是从引用列开始的索引,然后包含其他列,所以在你的情况下,表 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 中为这两列添加一个额外的索引:

    修改表A
    添加索引 tempindex (a, c);

关于mysql - 由父表中的部分主键组成的复合外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42596817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com