MySQL中无法添加具有相同列的外键

3

我有两张表格,每张表格都有一个provider列:

CREATE TABLE `title` (
  `provider` varchar(40) CHARACTER SET latin1 NOT NULL,

CREATE TABLE `notification` (
  `provider` varchar(40) CHARACTER SET latin1 NOT NULL,

然而,当我尝试添加外键时

ALTER TABLE notification ADD FOREIGN KEY (provider) REFERENCES title (provider)

我遇到了以下晦涩的错误:
Can't create table 'metadata.#sql-c91_345b' (errno: 150)

这两个表都是空的。为什么会发生这种情况,我需要做些什么来解决呢?


2
在添加引用 provider 的外键之前,尝试将其设置为主键。 - Sergey Kalinichenko
是因为有另一个主键吗?我很好奇在这种情况下是否可以链接到真正的主键。 - Sergey Kalinichenko
我这里确实有一个自增的主键 id,但即使我删除了该列(没有主键),我仍然遇到相同的错误。 - David542
你能否使用标题的自增整数主键而不是一个长度为40的varchar类型的主键?我记得MySQL以前要求目标列(即标题的提供者)存在一个唯一索引,可能在后续版本中有所改变,但值得尝试看看是否有帮助。 - Sergey Kalinichenko
你不小心在使用 MyISAM 引擎而非 InnoDB 吗?http://dev.mysql.com/doc/refman/5.6/en/innodb-foreign-key-constraints.html http://dev.mysql.com/doc/refman/5.0/en/innodb-error-codes.html - biziclop
2个回答

1
运行 SHOW ENGINE INNODB STATUS\G 命令,并查看 "LATEST FOREIGN KEY ERROR" 以获取有关错误的更多详细信息。

1

http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html中提到:

InnoDB要求在外键和引用键上建立索引,以便外键检查可以快速进行而不需要表扫描。

在引用表中,必须有一个索引,其中外键列按相同顺序列出为第一列。

如果不存在这样的索引,则在引用表上自动创建此类索引。

(这与某些旧版本形成对比,在这些版本中,必须显式创建索引或外键约束的创建将失败。)如果给定index_name,则如前所述使用它。

我认为在创建指向它的外键之前,您应该为title.provider创建任何(唯一、主键或普通)索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接