以下命令集:
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控制台中运行时,没有问题。
由于
吉迪
答案 0 :(得分:0)
我的理解是自动编制索引位于引用表中,而不是引用的表。
在您的情况下,自动索引会在ownerId
中添加opportunities
的索引...除非它不需要,因为您已经这样做了。
我不太明白"taous"."#sql-318c_27"
的来源,但假设它与users
表有关,我认为错误是抱怨id
没有编入索引。
答案 1 :(得分:0)
此错误的另一个原因可能是引用和引用表列的类型不匹配。
例如,ownerId
表的opportunities
列是INT
,Id
的{{1}}列是users
以外的任何类型{ {1}}
这并不能解释为什么它可以与控制台配合使用,而不是PDO,但也许这可以帮助其他人下线。