Magento - 使用升级脚本向表列添加索引

时间:2014-11-19 05:34:04

标签: magento

是否有人试图以magento方式向现有数据库表中的列添加索引?

当我尝试使用

$ table-> addIndex(' index_name',' field_name',' index_type'),它无效。

最后我尝试使用普通的ALTER TABLE查询

$ installer-> run(" ALTER TABLE table_name ADD INDEX index_name(field_name)");

我开始工作了。

问题是使用magento表DDL函数执行此操作可能会出现什么问题?

3 个答案:

答案 0 :(得分:8)

Magento允许您以两种方式运行SQL查询:

  1. 使用RAW sql查询
  2. 使用magento方式
  3. 使用RAW SQL查询

    您可以直接运行SQL查询。在您的方案中,

    <?php
    $installer = $this;
    $installer->startSetup();
    $sql=<<<SQLTEXT
    ALTER TABLE table_name ADD INDEX index_name(field_name);
    SQLTEXT;
    
    $installer->run($sql);
    $installer->endSetup();
    

    它会直接在表格中添加索引。

    使用magento方式

    使用magento的方式非常复杂。就像,

    <?php
    
    $installer = $this;
    $installer->startSetup();
    
    $tableName = $installer->getTable('Module_name/Table_name');
    // Check if the table already exists
    if ($installer->getConnection()->isTableExists($tableName)) {
    $table = $installer->getConnection();
    
    $table->addIndex(
      $installer->getIdxName(
        'your_namespace/your_table',
        array(
          'column1',
          'column2',
          'column3',
        ),
        Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE
      ),
      array(
        'column1',
        'column2',
        'column3',
      ),
      array('type' => Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE)
    )
    $installer->endSetup();
    }
    

    这里注意

     $tableName = $installer->getTable('Module_name/Table_name'); 
    

    您应该仔细添加模块名称和表名。其他明智的做法是不行。有关详细信息,请转到 here

    并且不要忘记在config.xml中添加以下内容以获取对数据库的身份验证

    <global>
    ...
    <resources>
          <modulename_setup>
            <setup>
              <module>Packagename_ModuleName</module>
            </setup>
            <connection>
              <use>core_setup</use>
            </connection>
          </modulename_setup>
          <modulename_write>
            <connection>
              <use>core_write</use>
            </connection>
          </modulename_write>
          <modulename_read>
            <connection>
              <use>core_read</use>
            </connection>
          </modulename_read>
        </resources>
    ...
    </global>
    

    那就是它。如果您有任何疑问,请在此发表评论。

答案 1 :(得分:2)

addIndex是连接对象的方法,而不是表对象。 像下面这样的东西可以做到这一点。检查Varien_Db_Adapter_Pdo_Mysql的源代码,了解$ installer-&gt; getConnection()对象的所有可用方法。

<?php 

$installer = $this;
$installer->startSetup();
if ($installer->tableExists($installer->getTable('module/table'))) {
    $installer->getConnection()
        ->addIndex(
            $installer->getTable('module/table'),
            $installer->getIdxName('module/table', array('column1', 'column2'), Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE),
            array('column1', 'column2'),
            Varien_Db_Adapter_Interface::INDEX_TYPE_UNIQUE
        );
}
$installer->endSetup();

答案 2 :(得分:0)

我认为上面的例子有点过于复杂。这是一个简单的升级脚本,用于以“Magento”方式向表中添加标准索引。将'foo / bar'替换为您的Magento模型进行更新,并将'baz'替换为您要编制索引的列。

<?php
$installer = $this;
$installer->startSetup();

$table = $installer->getTable('foo/bar');

if ($installer->getConnection()->isTableExists($table)) {
    $installer->getConnection()->addIndex($table, 'baz', array('baz'));
}

$installer->endSetup();