BLOB / TEXT列'值'在密钥规范中使用,没有密钥长度

时间:2011-09-02 21:18:34

标签: mysql magento

我开发了一个在Magento上运行良好的扩展,直到1.6(我正在尝试使用Enterprise编辑,我认为社区有同样的问题,因为它有相同的代码)。在我的安装脚本中,我正在调用$installer->createEntityTables($this->getTable('alphanum/info'));。安装就好了,直到它出现在_text实体表中。它崩溃了!事实证明,当我记录sql并通过PHPmyadmin运行它时,这是错误:BLOB/TEXT column 'value' used in key specification without a key length。我查看了代码,这就是尝试在值列上生成索引的内容:

->addIndex($this->getIdxName($eavTableName, array('attribute_id', 'value')),
     array('attribute_id', 'value'))
->addIndex($this->getIdxName($eavTableName, array('entity_type_id', 'value')),
     array('entity_type_id', 'value'))

它没有任何if语句,以确保它不是文本类型。有什么东西我错过了吗?我是否需要更改数据库配置?这可能是个错误吗?

我一直在围绕它放置一个if语句(将其从父链中分离出来)以获得扩展名。这应该很好。我查看了之前的rev(1.5.something),它没有那个索引。我只是无法弄清楚为什么它们在添加它时不会引起很多问题。让我想知道这是不是我的问题?

不知道这是否有助于包含Magento创建的SQL:

CREATE TABLE `alphanum_info_text` (
  `value_id` int NOT NULL auto_increment COMMENT 'Value Id',
  `entity_type_id` smallint UNSIGNED NOT NULL default '0' COMMENT 'Entity Type Id',
  `attribute_id` smallint UNSIGNED NOT NULL default '0' COMMENT 'Attribute Id',
  `store_id` smallint UNSIGNED NOT NULL default '0' COMMENT 'Store Id',
  `entity_id` int UNSIGNED NOT NULL default '0' COMMENT 'Entity Id',
  `value` text NOT NULL COMMENT 'Attribute Value',
  PRIMARY KEY (`value_id`),
  INDEX `IDX_ALPHANUM_INFO_TEXT_ENTITY_TYPE_ID` (`entity_type_id`),
  INDEX `IDX_ALPHANUM_INFO_TEXT_ATTRIBUTE_ID` (`attribute_id`),
  INDEX `IDX_ALPHANUM_INFO_TEXT_STORE_ID` (`store_id`),
  INDEX `IDX_ALPHANUM_INFO_TEXT_ENTITY_ID` (`entity_id`),
  INDEX `IDX_ALPHANUM_INFO_TEXT_ATTRIBUTE_ID_VALUE` (`attribute_id`, `value`),
  INDEX `IDX_ALPHANUM_INFO_TEXT_ENTITY_TYPE_ID_VALUE` (`entity_type_id`, `value`),
  CONSTRAINT `FK_ALPHANUM_INFO_TEXT_ENTITY_ID_EAV_ENTITY_ENTITY_ID` FOREIGN KEY     (`entity_id`) REFERENCES `eav_entity` (`entity_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `FK_ALPHA_NUM_TEXT_ENTT_TYPE_ID_EAV_ENTT_TYPE_ENTT_TYPE_ID` FOREIGN KEY (`entity_type_id`) REFERENCES `eav_entity_type` (`entity_type_id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `FK_ALPHANUM_INFO_TEXT_STORE_ID_CORE_STORE_STORE_ID` FOREIGN KEY (`store_id`) REFERENCES `core_store` (`store_id`) ON DELETE CASCADE ON UPDATE CASCADE
) COMMENT='Eav Entity Value Table' ENGINE=INNODB charset=utf8 COLLATE=utf8_general_ci

3 个答案:

答案 0 :(得分:9)

看起来这是问题(现在有同样的问题),这两行:

INDEX `IDX_ALPHANUM_INFO_TEXT_ATTRIBUTE_ID_VALUE` (`attribute_id`, `value`),
INDEX `IDX_ALPHANUM_INFO_TEXT_ENTITY_TYPE_ID_VALUE` (`entity_type_id`, `value`),

需要列出如下数值:

INDEX `IDX_ALPHANUM_INFO_TEXT_ATTRIBUTE_ID_VALUE` (`attribute_id`, `value`(255)),
INDEX `IDX_ALPHANUM_INFO_TEXT_ENTITY_TYPE_ID_VALUE` (`entity_type_id`, `value`(255)),

将其插入,即可使用。诀窍是让它正确插入。为了简洁起见,我不会发布整个函数,但是在Mage_Eav_Model_Entity_Setup::createEntityTables大约1341行,您需要修改这些行:

            ->addIndex($this->getIdxName($eavTableName, array('attribute_id', 'value')),
                array('attribute_id', 'value'))
            ->addIndex($this->getIdxName($eavTableName, array('entity_type_id', 'value')),
                array('entity_type_id', 'value'))

如下:

            ->addIndex($this->getIdxName($eavTableName, array('attribute_id', 'value')),
                array('attribute_id', $type == 'text' ? array('name' => 'value', 'size' => 255) : 'value'))
            ->addIndex($this->getIdxName($eavTableName, array('entity_type_id', 'value')),
                array('entity_type_id', $type == 'text' ? array('name' => 'value', 'size' => 255) : 'value'))

我不太确定你应该将大小值设置为什么,但我认为将其设置为完整的64k将首先打败索引的目的。希望有人能比我更了解sql。

希望有所帮助。

答案 1 :(得分:0)

它不是magento错误,而是mysql和你的(因为你不知道这个mysql限制)。请参阅此主题:MySQL error: key specification without a key length

答案 2 :(得分:0)

alter table table_name add  index index_name (column_name(767));

注意 767 是在处理blob /文本索引时MySQL将索引列的字符数限制

参考:http://dev.mysql.com/doc/refman/5.7/en/innodb-restrictions.html