我已经开发了一个在Magento上运行良好的扩展,直到1.6(我正在尝试Enterprise ed,我会认为社区有同样的问题,因为它有相同的代码).在我的安装脚本中,我正在打电话$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'))
Run Code Online (Sandbox Code Playgroud)
它没有任何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
Run Code Online (Sandbox Code Playgroud)
看起来这是问题(现在有相同的问题),这两行:
INDEX `IDX_ALPHANUM_INFO_TEXT_ATTRIBUTE_ID_VALUE` (`attribute_id`, `value`),
INDEX `IDX_ALPHANUM_INFO_TEXT_ENTITY_TYPE_ID_VALUE` (`entity_type_id`, `value`),
Run Code Online (Sandbox Code Playgroud)
需要具有如下列出的数值:
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)),
Run Code Online (Sandbox Code Playgroud)
插入,它将工作.诀窍是让它正确插入.为简洁起见,我不会发布整个函数,但在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'))
Run Code Online (Sandbox Code Playgroud)
如下:
->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'))
Run Code Online (Sandbox Code Playgroud)
我不太确定你应该将大小值设置为什么,但我认为将其设置为完整的64k将首先打败索引的目的.希望有人比我知道更多关于sql的信息.
希望有所帮助.