【问题标题】:MYSQL: foreign keys auto indexingMYSQL:外键自动索引
【发布时间】: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


【解决方案1】:

我的理解是自动索引是在 referenceing 表而不是 referenced 表上。

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

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

【讨论】:

    【解决方案2】:

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

    例如,如果opportunities 表的ownerId 列是INT,但usersId 列是INT 以外的任何类型

    这并不能解释为什么它可以与控制台而不是 PDO 一起工作,但也许这可以帮助其他人。

    【讨论】:

      猜你喜欢
      • 2010-09-23
      • 2021-11-18
      • 1970-01-01
      • 2010-11-01
      • 2011-08-22
      • 2015-05-12
      • 2015-01-26
      • 2010-10-24
      相关资源
      最近更新 更多