mysql - BLOB/TEXT 列 'value' 用于没有 key 长度的 key 规范

标签 mysql magento

我开发了一个扩展,在 1.6 之前在 Magento 上运行良好(我正在尝试企业版,我认为社区有同样的问题,因为它有相同的代码)。在我的安装脚本中,我调用了 $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 语句(将其从父链中分离出来)以获取扩展。这应该很好地做到了。我查看了之前的版本(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

最佳答案

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

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 的人会插话。

希望对您有所帮助。

关于mysql - BLOB/TEXT 列 'value' 用于没有 key 长度的 key 规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7289313/

相关文章:

php - PHP/MySQL 中的更新查询失败,错误代码 1064,SQLState 42000

javascript - AspNet 一个 View 上的两个表

mysql - 排除列值上的连接记录?

php - MySQL - 选择计数返回真

javascript - 未捕获错误 : Syntax error, 无法识别的表达式。转义字符?

php - codeigniter batch_update-插入确认

mysql - Google Data Studio MySQL 日期问题

没有自定义选项的 Magento 重复产品

php - Magento 自定义模块, fatal error : Call to a member function setFormAction()

jquery - Magento 可配置产品图像缩放问题