【问题标题】:Index mysql corrupted?索引mysql损坏?
【发布时间】:2012-08-29 12:40:53
【问题描述】:

有一个 mysql 表,我认为唯一索引已损坏。 当我执行以下 sql 时:

SELECT field_b FROM table LIMIT 0,10 

响应为 NULL(10 行为 NULL)。

但是如果我执行

SELECT field_b FROM table WHERE field_a = 1

我正在获取(非空)数据。发生了什么?

以下是表格属性

field_a and field_b = INT(11)
field_a = PRIMARY
field_b = UNIQUE INDEX
Table type = INNODB

此表中有 200k+ 行。

【问题讨论】:

  • “响应为 NULL”是什么意思?您的结果集中是否有零行,或者这就是某些 SQL 包装方法返回的内容?
  • 返回 10 行且全部为 NULL 的平均值
  • 但这不能仅仅意味着表的前 10 行将 field_b 设置为 NULL(即使在 InnoDB 中使用 UNIQUE 约束也是可能的)?试试这个查询:SELECT COUNT(*) FROM table WHERE field_b IS NULL 来检查这个。
  • "first 10" -- 表示它选择获取的前 10 个;可能来自INDEX(field_b);这就是任何 NULL 值的位置。

标签: mysql indexing corrupt


【解决方案1】:

尝试filed_b 而不是field_b

SELECT filed_b From table limit 0,10 //spelling mistake

【讨论】:

    【解决方案2】:

    在具有唯一索引的列中可以有重复的 NULL 值。唯一索引只保证非空值是唯一的。

    正如documentation 所述,BDB 存储引擎存在异常。

    一个 UNIQUE 索引创建一个约束,使得索引中的所有值 必须是不同的。如果您尝试添加带有 与现有行匹配的键值。此约束不适用 为 NULL 值,BDB 存储引擎除外。

    您至少有十行 field_b 为 NULL,并且在您发出查询时它们会显示出来。

    要查看 field_b 为 NULL 的所有行,请尝试以下操作:

    SELECT * FROM table WHERE field_b IS NULL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多