【问题标题】:Trouble with adding foreign key添加外键的问题
【发布时间】:2016-02-01 18:56:43
【问题描述】:

我有下一个表“对话”:

现在我想添加下一个 fk:

alter table dialogs add constraint dias_fk foreign key(Receiver) references users (Surname);

但出现错误:

错误代码:1215。无法添加外键约束

用户表:

我知道,我只能使用“users”和“dialogs”表中的主键列创建 fk,但我有 auto_increment 列,它必须是 pk。我无法在代码中创建两个原色,但是使用工作台实用程序更改表,看起来我已经创建了两个原色而没有错误。

我该如何解决这个问题?

【问题讨论】:

  • 作为父表(如果您愿意的话)的表需要列上的索引。它甚至可以位于复合索引的最左侧。
  • @Drew 好的,我已经创建了索引:clip2net.com/s/3pHzALR,接下来我必须做什么?
  • 好吧,您需要确保引用的表中包含支持 FK 创建的数据。毕竟,您是说数据必须存在。所以没有它,它是一个非首发。并查看字符集问题。
  • 不要忘记支持、反对、接受适当的答案。甚至诸如“这是垃圾,毫无意义”之类的反馈。我们使用这些反馈,并为我们帮助下一个人而欢呼,不管它是什么。

标签: mysql sql foreign-keys mysql-workbench


【解决方案1】:

来自题为Using FOREIGN KEY Constraints的mysql手册页

外键和引用键中的对应列必须 具有相似的数据类型。整数类型的大小和符号必须是 相同。字符串类型的长度不必相同。为了 非二进制(字符)字符串列、字符集和排序规则 必须相同。

当 foreign_key_checks 启用时,这是默认设置, 不允许在包含字符集的表上进行字符集转换 外键约束中使用的字符串列。这 第 13.1.6 节“ALTER TABLE 语法”中描述了解决方法。

MySQL 需要外键和引用键的索引,以便 外键检查可以很快并且不需要表扫描。在里面 引用表,必须有外键所在的索引 列按相同顺序列为第一列。这样一个 如果没有,则在引用表上自动创建索引 存在。如果您创建,此索引可能会在稍后被静默删除 另一个可用于强制外键约束的索引。 index_name,如果给定,则如前所述使用。

因此,您的问题不是关注 PK,而是关注最左侧的索引。另请注意,45 在阅读上述内容时并不重要。但是字符集肯定是一个潜在的问题。

另一个显而易见但我经常忘记的问题是,referenced 表必须有一个数据状态,该状态一开始就支持这种 FK 创建。意思是,数据必须在那里,以便在调用更改引用表之后,可以说FK受到引用表的尊重。

我最后一点的说明

create table referenced
(   -- a.k.a. parent
    id int auto_increment primary key,
    thing varchar(45) not null,
    key(thing)
    -- ok I have 2 indexes not
);
insert referenced (thing) values ('fish');

create table referencing
(   -- a.k.a. child
    id int auto_increment primary key,
    thing varchar(45) not null,
    key(thing)
    -- ok I have 2 indexes not
);
insert referencing (thing) values ('fish'),('frog');

alter table referencing add constraint thing_fk foreign key(thing) references referenced (thing);

错误代码:1452。无法添加或更新子行:外键 约束失败(so_gibberish.#sql-6cc_41, CONSTRAINT thing_fk 外键 (thing) 引用 referenced (thing)) 0.859 秒

怎么办?

好吧,毕竟清理引用了。

insert referenced(thing) values('frog');

alter table referencing add constraint thing_fk foreign key(thing) references referenced (thing);

--快乐时光

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-17
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多