2011-12-07 10 views
0

におけるインデックスキーの長さを指定します。は、あなたは、MySQLのInnoDBエンジンを使用してインデックスキーを定義しようとしている場合、このエラーメッセージを得ることができCakeSchema

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

これは実際MySQL documentationに警告しています。

解決策はかなり簡単です。あなただけのSQLでキーの長さを指定する必要があり、例えば:

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

しかし、CakePHPのスキーマや備品を扱うとき、私はこのように私のテストが失敗し、これを指定する方法を発見したことができませんでした。

代わりの解決策は、治具のアレイを削除することです。しかし、CakeSchemaを通してそれをやることはいいですね。

CakePHP 2.0の実際のCakeSchemaでこれを行うことは可能ですか?

ありがとうございます!

答えて

0

いや、それはCakeSchema内でサポートされていません表示されます:(

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

あなたはそれをサポートするためのカスタムSQLに依存する必要があります。

私が管理するCakeDC移行プラグインを使用スキーマの変更(上下)。それと

https://github.com/CakeDC/migrations

、私が使用していますカスタム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; 
} 

`` `

をトリガーするために後の()コールバック
関連する問題