【发布时间】:2011-07-01 13:42:37
【问题描述】:
以下命令集:
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) 在删除时引用用户 (id) 在更新级联时设置为 null ;
所以我知道引用的列上缺少索引
现在,foreign key constraints 的 mysql 文档指出:
InnoDB 需要外键和引用键的索引,以便外键检查可以快速且不需要表扫描。在引用表中,必须有一个索引,其中外键列按相同顺序列为 first 列。如果引用表不存在,则会在引用表上自动创建此类索引。 (这与一些旧版本形成对比,在这些旧版本中,索引必须显式创建,否则外键约束的创建将失败。)
index_name,如果给定,则如前所述使用。
我运行 mysql 5.1 (xampp, windows) 所以我希望在创建外键时自动索引这些列。
知道为什么自动索引会失败吗?
还有一点: 该错误仅在通过 PDO(数据库更新工具)运行 sql 命令时发生。当直接在 mysql 控制台中运行时,没有问题。
谢谢
吉迪
【问题讨论】:
-
出于好奇,您通过 PDO 连接的用户实际上是否有权创建索引?
-
能否允许用户创建表但不能创建索引?无论如何,我与 root 连接
-
RE:创建表但不是indexes:是的,这些需要单独的权限。请注意,主机名是用户身份的一部分; 'root'@'localhost' 与 'root'@'%' 是不同的帐户。根据您连接的位置,您可能会获得不同的特权。尝试使用
SHOW GRANTS命令以及SELECT CURRENT_USER()来获取完整的用户名。 -
只是为了确保不会遗漏显而易见的事实:
users表确实定义了一个主键,并且该键完全由id列组成? -
@a_horse_with_no_name,感谢您的提问,用户拥有 id 作为外键(唯一的外键)
标签: mysql foreign-keys indexing