如果要使用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执行此操作?
谢谢!
答案 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;
}
```