在CakeSchema中指定索引键的长度

时间:2011-12-07 14:32:05

标签: sql cakephp indexing database-schema

如果要使用MySQL的InnoDB引擎定义索引键,可能会收到以下错误消息:

"Specified key was too long; max key length is 767 bytes"

这实际上是在MySQL documentation中警告的。

解决方案非常简单。您只需在SQL中指定密钥长度,例如:

CONSTRAINT UNIQUE INDEX (`name`(50), `active`)

但是在处理CakePHP模式和装置时,我找不到指定方法的方法,因此我的测试失败了。

另一种解决方案可能是删除灯具的'indexes'数组。但是通过CakeSchema来做它会很好。

是否可以使用CakePHP 2.0中的实际CakeSchema执行此操作?

谢谢!

1 个答案:

答案 0 :(得分:0)

看起来在CakeSchema中不支持:(

http://api.cakephp.org/view_source/dbo-source#l-3103

您必须依赖自定义SQL来支持它。

我使用CakeDC Migrations插件来管理架构更改(上下)。

https://github.com/CakeDC/migrations

有了这个,我使用了after()回调来触发自定义的alter语句

var $migration = array(
    'up' => array(
        'create_field' => array(
            'utils' => array(
                'indexes' => array(
                    // can not add here, because we can't specify column
                    // length - see after() callback
                    //'key_val' => array('column' => array('key', 'val'), 'unique' => 0),
                    'key_misc1' => array('column' => array('key', 'misc1'), 'unique' => 0),
                )
            )
        )
    ),
    'down' => array(
        'drop_field' => array(
            'utils' => array(
                'indexes' => array(
                    'key_val',
                    'key_misc1',
                )
            )
        )
    ),
);
function after($direction) {
    if ($direction=='up') {
        $sql = 'ALTER TABLE `utils` ADD INDEX `key_val` (`key`, `val`(128));';
        $Util = ClassRegistry::init('Util');
        $Util->query($sql);
    }
    return true;
}

```