mySQLでキー長のエラーが発生しました。キー長を修正する方法を教えてください。

このQ&Aのポイント
  • mySQLでキー長のエラーが発生しました。具体的には、user_detailsテーブルでキー長がオーバーしているため、エラーが出ています。
  • キー長がオーバーしている原因は、データ型や文字列の長さにあります。キーの長さを767バイト以下にする必要があります。
  • 具体的に修正する方法は、user_detailsテーブルの各カラムのデータ型や長さを調整することです。キーの長さが767バイト以下になるように修正してください。
回答を見る
  • ベストアンサー

mySQLでキー長のエラー

var $user_details = array( 'id' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 36, 'key' => 'primary'), 'user_id' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 36), 'position' => array('type' => 'float', 'null' => false, 'default' => '1'), 'field' => array('type' => 'string', 'null' => false, 'default' => NULL, 'key' => 'index'), 'value' => array('type' => 'text', 'null' => true, 'default' => NULL), 'input' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 16), 'data_type' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 16), 'label' => array('type' => 'string', 'null' => false, 'length' => 128), 'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1), 'UNIQUE_PROFILE_PROPERTY' => array('column' => array('field', 'user_id'), 'unique' => 1)) ); var $users = array( 'id' => array('type' => 'string', 'null' => false, 'default' => NULL, 'length' => 36, 'key' => 'primary'), 'username' => array('type' => 'string', 'null' => false, 'default' => NULL, 'key' => 'index'), 'slug' => array('type' => 'string', 'null' => false, 'default' => NULL), 'password' => array('type' => 'string', 'null' => true, 'default' => NULL, 'length' => 128), 'password_token' => array('type' => 'string', 'null' => true, 'default' => NULL, 'length' => 128), 'email' => array('type' => 'string', 'null' => true, 'default' => NULL, 'key' => 'index'), 'email_verified' => array('type' => 'boolean', 'null' => true, 'default' => '0'), 'email_token' => array('type' => 'string', 'null' => true, 'default' => NULL), 'email_token_expires' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'tos' => array('type' => 'boolean', 'null' => true, 'default' => '0'), 'active' => array('type' => 'boolean', 'null' => true, 'default' => '0'), 'last_login' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'last_action' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'is_admin' => array('type' => 'boolean', 'null' => true, 'default' => '0'), 'role' => array('type' => 'string', 'null' => true, 'default' => NULL), 'created' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'modified' => array('type' => 'datetime', 'null' => true, 'default' => NULL), 'indexes' => array('PRIMARY' => array('column' => 'id', 'unique' => 1), 'BY_USERNAME' => array('column' => array('username'), 'unique' => 0), 'BY_EMAIL' => array('column' => array('email'), 'unique' => 0)) ); } というスキーマ定義をしたところ、 user_detailsだけ、 user_details: SQLSTATE[42000]: Syntax error or access violation: 1071 Specified key was too long; max key length is 767 bytes というエラーが出てしまいます。キー長がオーバーしているらしいのですが、具体的にどこをどう修正すれば767バイト以下になるのかわかりません。 色々試して見たのですがわかりませんでした。 ご教示頂ければ幸いです。よろしくおねがいいたします。

  • MySQL
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

多分こちらの件と同様かと思われますがどうでしょうか? MySQLの UNIQUEなINDEXには長さ767byteまでしか使えない件と対策 http://d.hatena.ne.jp/tanamon/20090930/1254332746

参考URL:
http://d.hatena.ne.jp/tanamon/20090930/1254332746

関連するQ&A

  • text型とuniqueについて

    mysqlでテーブル作成したいのですが l_urlのtext型のuniqueは、どうやって作成したらいいのでしょうか? 後、テーブル作成を実際すると結構つまずくので練習したいのですが 何かいい勉強方法はありますか? /* リンクデータ用テーブル作成 CREATE TABLE linkdata ( id int NOT NULL auto_increment, l_url text NOT NULL unique, l_title varchar(100) NOT NULL default '', l_comment varchar(255) default NULL, l_date datetime default NULL, PRIMARY KEY (id) ); 実行結果: ERROR 1170 (42000): BLOB/TEXT column 'l_url' used in key specification without a key length mysql>

    • ベストアンサー
    • MySQL
  • REPLACEクエリで条件文を使用するには?

    REPLACEクエリで条件文を使用するには? 以下で、bannedカラムがtrueの時だけfalseに変更しないようにするにはどうすればいいでしょうか? /*テーブルを作成*/ CREATE TABLE test (name CHAR(100) UNIQUE, banned BOOLEAN DEFAULT FALSE NOT NULL); /*bannedカラムにfalseを注入*/ REPLACE INTO test (name) VALUES('鈴木'); /*bannedカラムをfalseからtrueに変更*/ REPLACE INTO test (name,banned) VALUES('鈴木',true); /*このクエリを実行してもbannedカラムをtrueからfalseにしないようにするには*/ REPLACE INTO test (name) VALUES('鈴木');

    • ベストアンサー
    • MySQL
  • usersテーブルの構成カラムについて

    MySQLバージョン4.1.16を使用しています。 このジャンルでお願いします。 よく全ての基本となるusersテーブル(IDとパスワードを入れるユーザの基本テーブル) があると思うのですが、それを構成するカラムはどのような感じにするのが良いのでしょうか? 自分は、 CREATE TABLE `users` ( `user_id` varchar(16), `password` varchar(255) default NULL, `col1` varchar(255) NOT NULL, `col2` varchar(255) NOT NULL, PRIMARY KEY (`user_id`), ) ENGINE=InnoDB; このように代替キー(連番)を使わずにuser_idを主キー(unique)にして構成します。 理由としては、uniqueな列があるなら、わざわざ連番を割り当てる必要もないし、 他のテーブルがuser_idを外部キーとして持った時に、その表の外部キーの列が 数字であるよりも見やすいかなと思ったからです。 ただ一般的に出まわっているPHPフレームワークなどのテーブル構成ではusersテーブルというか ほとんどのテーブルに連番を使っている例があります。 次のusersテーブルは、PHPフレームワークのCakePHPで使われるusersテーブルの構成の例で、 連番を使用しています。 CREATE TABLE `users` ( `id` int(11) NOT NULL auto_increment, `username` varchar(255) collate utf8_unicode_ci default NULL, `password` varchar(255) collate utf8_unicode_ci default NULL, `group_id` int(11) NOT NULL, `disabled` tinyint(1) NOT NULL, `created` datetime default NULL, `modified` datetime default NULL, PRIMARY KEY (`id`), KEY `group_id` (`group_id`), KEY `disabled` (`disabled`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 使用状況によって、どちらが良い悪いというのは変わるのでしょうけど 基本的にusersテーブルというのはどのような構成にすべきなのでしょうか? ちなみに自分は連番は○○_seqというカラム名にしてます(ただこれも 一般的には○○idを連番にしてるケースが多いので、どうすべきか迷っています・・・)

    • ベストアンサー
    • MySQL
  • MySQLのテーブル設計で迷っています(桁数)

    MySQLのテーブル設計で迷っています。 クリエイト文のカッコの中は桁数を表しているのでしょうか?それともバイト数でしょうか?桁数であれば、それぞれの型で何桁まで設定できますでしょうか? int型のnoを18桁に変更したいのですが、調べているうちに迷ってしまいました。 型 バイト 最小値 最大値 TINYINT 1 -128 127 SMALLINT 2 -32768 32767 MEDIUMINT 3 -8388608 8388607 INT 4 -2147483648 2147483647 BIGINT 8 -9223372036854775808 9223372036854775807 CREATE TABLE `user` ( `no` int(8) unsigned NOT NULL auto_increment, `id` varchar(24) NOT NULL default '', `email` varchar(255) NOT NULL default '', `reg_date` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`no`) ) TYPE=MyISAM;

    • ベストアンサー
    • MySQL
  • SQLのPRIMARY KEYの後のKEYについて

    SQLの超初心者です。 SQLのPRIMARY KEYの後のKEYについてご教授ください。m(__)m CREATE TABLE ***** (   shipping_id NOT NULL default 0,   order_date datetime NOT NULL default 0000-00-00 00:00:00,     ・     ・   PRIMARY KEY (shipping_id),   KEY order_date (order_date) ) の様に参考書に記載があるのですが、 KEY order_date (order_date) の部分の意味がわかりません。 どなたか詳しい方アドバイスお願いします。

  • MySQLでエラーがでます

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '"8cb2237d0679ca88db6464eac60da96345513964", created"2011-10-05 15:16:04"' at line 1 PHPをブラウザで開いて動作確認すると上記のようにエラーがでてしまいます。 dbはこんな感じで作りました。 CREATE TABLE `class_orms`.`members` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` VARCHAR( 255 ) NOT NULL , `email` VARCHAR( 255 ) NOT NULL , `password` VARCHAR( 100 ) NOT NULL , `created` DATETIME NOT NULL , `modified` TIMESTAMP NOT NULL ) ENGINE = MYISAM ; CREATE TABLE `class_orms`.`posts` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `message` TEXT NOT NULL , `member_id` INT NOT NULL , `reply_post_id` INT NOT NULL , `created` DATETIME NOT NULL , `modified` TIMESTAMP NOT NULL ) ENGINE = MYISAM ; SQL側の1行目でエラーがあるということなのでしょうか? どなたか回答よろしくお願いします。 動作環境------------------- Apache/2.2.14 (Win32) DAV/2 mod_ssl/2.2.14 OpenSSL/0.9.8l mod_autoindex_color PHP/5.3.1 phpMyAdmin バージョン情報: 3.2.4

    • ベストアンサー
    • MySQL
  • MySQL insert文に関するエラーについて

    ○質問の主旨 MySQLのデータベースにテーブルを作ってinsert文で データを追加しようとするとシンタックスエラーが出ます。 SQL文が間違っているのかと思いGoogle検索や本で調べたりしましたが、 なぜ文法エラーが発生するのか分かりません。 エラーと対処方法をご存知の方がいらっしゃいましたらご教示願います。 ○質問の補足 // usersテーブル create table users ( id int not null auto_increment primary key, created datetime not null, modified datetime not null, username varchar(255), password varchar(40) ); desc users; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | created | datetime | NO | | NULL | | | modified | datetime | NO | | NULL | | | username | varchar(255) | YES | | NULL | | | password | varchar(40) | YES | | NULL | | +----------+--------------+------+-----+---------+----------------+ insert into users (created, modified, username, password) values (now(), now(), 'test1', 'test1'), (now(), now(), 'test2', 'test2') ); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 3

    • ベストアンサー
    • MySQL
  • MySQL5.1.14で空白を入れるとエラーになる

    MySQL5.1.14をインストールをしたところ、4.1で動いていたプログラムが軒並みエラーストップ。 どうも、空白を入れるとエラーになるようで、5.1へ移行出来なくて困っています。どなたかご教授をお願いします。 環境は Windows2000Pro MySQL 5.1.14-beta サンプルのテーブルは drop table if exists addressbook; CREATE TABLE addressbook( id smallint(4) UNSIGNED NOT NULL auto_increment, name1 varchar(20) default NULL, birthday date default NULL, PRIMARY KEY (id) ) ENGINE=MyISAM DEFAULT CHARSET=sjis; INSERT INTO addressbook VALUES ('','名前1','2006-12-22'), ('','',''); で次のエラーが出る。 ERROR 1366 (HY000): Incorrect integer value: '' for column 'id' at row 1

    • ベストアンサー
    • MySQL
  • mysqlのindexとprimary keyについて

    indexキーとprimary keyについてですが、違いというのは、NULLが許可されるか、されないかの違いでしょうか? データベースから検索する際に、indexキーがある方が検索スピードが速いということですが、あるHPに《PRIMARY KEY が宣言されたカラムは自動で Index Key と Unique Key が適応されます》とありました。 ですので、検索スピードを上げるには、PRIMARY KEYを設定すれば、indexキーが設定されたのと同じ事になるのでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLで0以外をユニークにする制約をかけたい

    MySQLで主キーのidの他にfoofoo_idというint型カラムがあります。 このfoofoo_idを0以外をユニークしたいのですが可能でしょうか? MySQLのバージョンは8.0.21です。 検索をかけたところNULL以外をユニークにするという記事を見つけたので、下記のようにNULLではなく0にしてみましたが、そもそもWHEREの部分がダメのようで通りませんでした。 CREATE UNIQUE INDEX uq_foofoo_id ON `hogehoge`.`sample`(foofoo_id) WHERE foofoo_id IS NOT '0' ;

    • ベストアンサー
    • MySQL