Error number: MY-011853; Symbol: ER_IB_MSG_28; SQLSTATE: HY000
Message: %s
错误ER_IB_MSG_28的全称是InnoDB:只有索引字段在GROUP BY或ORDER BY中使用。这是MySQL错误之一,用于告诉程序员当他尝试使用在GROUP BY或ORDER BY子句中未出现在索引字段中的字段时无法编译作为有效的索引。这个错误多次报告,一般出现在MySQL中使用InnoDB表类型时。
SELECT * FROM USER ORDER BY City;
在这种情况下,MySQL无法确定其功能,因为目标记录不在任何索引字段中,因此它会拒绝编译此查询,并生成ER_IB_MSG_28错误。
解决方法:解决ER_IB_MSG_28错误的最简单方法是为表添加索引以包含期望排序或组合字段。在我们的“USER”表中,我们可以加上City索引:
ALTER TABLE USER ADD INDEX (City);
现在,查询将在City索引中查找所需字段,并可以正确编译,而不会出现ER_IB_MSG_28错误。当数据库表中没有使用任何索引,或只用了少量表索引时,可能仍然会出现ER_IB_MSG_28错误。在这种情况下,我们可以手动添加索引指定列表中的字段,以正确编译SELECT查询。这可以有效地解决ER_IB_MSG_28错误,因为MySQL不会拒绝编译SELECT查询。
另一个可能的解决方法是更改SELECT查询,以引用索引字段,而不是非索引字段。例如,在上面的“USER”表情况下,mySQL在GROUP BY或ORDER BY子句中不接受“City”字段,但可以接受“Name”字段:
SELECT * FROM USER ORDER BY Name;
这是一种有效的方法来解决ER_IB_MSG_28错误,而无需更改表结构或添加索引。
总而言之,ER_IB_MSG_28错误通常是由于使用了InnoDB表而缺少索引所致,可以通过增加表索引或修改SELECT查询来解决。