MYSQL:外键自动索引

时间:2011-02-21 21:03:21

标签: mysql foreign-keys indexing

以下命令集:

alter table opportunities add column ownerId int null;
alter table opportunities add foreign key (ownerId) references users (id) on delete set null on update cascade;

产生如下错误:

  

表taous /#sql-318c_27的外键约束出错:   表“taous”中没有索引。“#sql-318c_27”列出现   作为第一列。约束:   外键(ownerId)引用更新级联上的删除集null上的用户(id)   ;

所以我理解引用列

上缺少索引

现在,foreign key constraints的mysql文档指出:

  

InnoDB需要外键和引用键的索引,以便外键检查速度快,不需要进行表扫描。在引用表中,必须有一个索引,其中外键列以相同的顺序列为 first 列。如果引用表不存在,则会自动在引用表上创建此索引。 (这与某些旧版本形成对比,其中必须明确创建索引或创建外键约束失败。) index_name ,如果给定,则如前所述使用

我运行mysql 5.1(xampp,windows)所以我希望在创建外键时自动索引列。

知道为什么自动索引会失败吗?

还有一点: 仅当通过PDO(db更新工具)运行sql命令时才会发生此错误。直接在mysql控制台中运行时,没有问题。

由于

吉迪

2 个答案:

答案 0 :(得分:0)

我的理解是自动编制索引位于引用表中,而不是引用的表。

在您的情况下,自动索引会在ownerId中添加opportunities的索引...除非它不需要,因为您已经这样做了。

我不太明白"taous"."#sql-318c_27"的来源,但假设它与users表有关,我认为错误是抱怨id没有编入索引。

答案 1 :(得分:0)

此错误的另一个原因可能是引用和引用表列的类型不匹配。

例如,ownerId表的opportunities列是INTId的{​​{1}}列是users以外的任何类型{ {1}}

这并不能解释为什么它可以与控制台配合使用,而不是PDO,但也许这可以帮助其他人下线。