是否有人试图以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函数执行此操作可能会出现什么问题?
答案 0 :(得分:8)
Magento允许您以两种方式运行SQL查询:
使用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();