mysqlのsqlスクリプトエラーについて

このQ&Aのポイント
  • mysqlのバージョンによるsqlスクリプトエラーが発生しています
  • テーブル作成時にunique制約で引っかかりエラーが発生しています
  • 特定のカラムのkey specificationに長さが指定されていないためエラーが発生しています
回答を見る
  • ベストアンサー

mysqlのsqlスクリプトエラーについて

バージョンはmysql-4.0.14b-winです。 + mysql-connector-java-3.0.8-stable-bin 昔、このsqlを実行したときはうまくいっていたのですが 最近実行すると以下のようなエラーがでます バージョンのちがいがあるのでしょうか? unique制約で引っかかっているみたいです。 <実行> +----------------------------------------------+ | 1.MYSQLで以下のようにテーブルを作成しました。| +----------------------------------------------+ C:\>mysql\bin\mysqladmin -u root -p CREATE user Enter password: root C:\>mysql\bin\mysql -u root -p user < c:\syain.sql Enter password: root <問題点> 以下のようなエラーがでましたERROR 1170 at line 8: BLOB column 'username' used in key specification without a key length <実行したsql文> syain.sqlの内容は以下のとおりです。-- -- Host: localhost Database: user --------------------------------------------------------- -- -- Table structure for table 'table1' -- create table table1 (     id integer primary key, username text not null unique, password text not null, idnumber text not null, department text not null, mail text not null, extension text not null); -- -- Dumping data for table 'table1' -- --INSERT INTO table1 VALUES (1,'Peter','123456','1201','情報システム部','peter@it.planet.com','101'); INSERT INTO table1 VALUES (1,'Robert','abcdef','1202','情報システム部','robert@it.planet.com','102'); INSERT INTO table1 VALUES (1,'Mike','abcdef','1203','企画部','mike@pl.planet.com','201'); INSERT INTO table1 VALUES (1,'Celline','abcdef','1204','営業部','celine@mk.planet.com','301'); INSERT INTO table1 VALUES (1,'Akira','abcdef','1205','技術部','akira@tec.planet.com','401'); INSERT INTO table1 VALUES (1,'Eric','abcdef','1206','経理部','eric@ac.planet.com','501'); INSERT INTO table1 VALUES (1,'Rika','abcdef','1207','営業部','rika@mk.planet.com','302'); INSERT INTO table1 VALUES (1,'Diana','abcdef','1208','営業部','diana@mk.planet.com','303'); INSERT INTO table1 VALUES (1,'Britney','abcdef','1209','企画部','britney@pl.planet.com','202'); INSERT INTO table1 VALUES (1,'Takuya','abcdef','1210','技術部','takuya@tec.planet.com','402'); ご教授よろしくお願いします

  • MySQL
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
  • ESE_SE
  • ベストアンサー率34% (157/458)
回答No.1

MySQLは門外漢ですが・・・ エラーメッセージによると 「列"username"がキー長の設定無しにキーに指定されていますよ」 ということでしょうか? usernameをtextではなくchar(15)など固定長にしてみてはいかがでしょうか?

takeshif
質問者

お礼

usernameをtextではなくchar(15)など固定長にしてみたら うまくいきました。 助かりました。ありがとうございました。 感謝しています。また質問の機会がありましたらそのときは よろしくお願いします。

その他の回答 (2)

回答No.3

MySQLでは、text型の扱いにいろいろ制限があったものを、「長さを指定する」ことで可能にしたと記憶しています。 なお、他の方も指摘していますが、text型の使用は最小限にしましょう。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

#1さんの指摘があるようにtextはunique属性が付加できません そもそもSQLにおいてtextタイプのフィールドはインデックスも きかず、スピードが期待できないためめったなことでは 使わない方がよいでしょう。 基本は、charもしくはvarcharです。

関連するQ&A

  • sqlスクリプトエラーその2について

    以下のコマンドを実行するとtrueのところでエラーになります。 以前実行したときはうまくいったのですが原因がよくわかりません。 C:\>mysql\bin\mysqladmin -u root -p CREATE sample2 Enter password: **** C:\>mysql\bin\mysql -u root -p sample2 < c:\database.sql Enter password: **** ERROR 1054 at line 22: Unknown column 'true' in 'field list' <database.sql>-- ユーザを表すテーブル create table schedule_user ( id integer primary key, -- ユーザID name text not null, -- 名前 mailaddress text not null, -- メールアドレス password text not null); -- パスワード -- 予定を表すテーブル create table schedule ( id integer primary key, -- 予定ID user_id integer not null, -- この予定を入れたユーザのユーザID subject text not null, -- 予定の題名 content text not null, -- 予定の内容 start_time timestamp not null, -- 予定の開始日時 end_time timestamp not null, -- 予定の終了日時 place text, -- 予定の場所 comment text, -- 予定のコメント is_publish bool not null); -- 予定の公開/非公開フラグ -- テスト用のデータ insert into schedule_user values(1, 'itboost','motomatu@itboost.co.jp', 'itboost'); insert into schedule values(1, 1, '予定1', '予定1です', '2003-01-01 10:00', '2003-01-01 10:30', 'A社', '予定1のコメントです。', true); insert into schedule values(2, 1, '予定2', '予定2です', '2003-01-01 10:00', '2003-01-02 10:30', 'B社', '予定2のコメントです。', false); insert into schedule values(3, 1, '予定3', '予定3です', '2003-01-01 20:00', '2003-01-03 22:30', 'C社', '予定3のコメントです。', true); ご教授よろしくおねがいします。

  • PHP/MySQL SQLエラーについて。

    PHP/MySQLについての質問です。 当方PHP/MySQLについては初心者で、現在参考書を見ながらWebアプリケーションを作成しています。 いくらやっても成功しない例があるので、どこが間違っているのか、 なぜ成功しないのかご教示願いたいです。 エラー名:SQL実行エラー 要因:不明。SQL文を変えたりしたところ成功したこともあるので(elect id,name,age from input_table 等)SQL文に間違いがあるのか? -------------------input.html------------------------ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <form action="input.php" method="post"> 名前:<input type="text" name="nm"> 年齢:<input type="text" name="age"> <input type="submit" name="exec" value="登録"> </form> </body> </html> -----------------------input.php---------------------------- <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <?php //DB接続 if(!$con=mysql_connect("localhost","root","********")){ //passwardは正確 echo"接続エラー"; exit; } //DB選択 if(!mysql_select_db("input",$con)){ echo"DB選択エラー"; exit; } $sql = "insert into input_table(name,age) values('$nm',$age)"; if(!$res=mysql_query($sql)){ echo"SQL実行エラー"; //ここでこのエラーが表示されてしまう exit; } echo "登録完了"; mysql_close($con); ?> </body> </html> --------------------database----------------------- create table input_table( id int not null auto_increment, name varchar(20) not null, age int not null, primary key(id) )

    • ベストアンサー
    • PHP
  • mySQL

    今日は mySQLにて あるテーブルへデータを入れようと、 INSERT INTO table VALUES( "000", "?", "試験" ) といった具合に、入れてみました。 アクセスでリンクしてあるので、フィールドを見ると 半角「?」はNULLに置き換えられてますが なぜ?

  • MySQLから取り出したものを3つに分ける

    MySQLに以下のようなSQLを打ちました。 create table table_list( id int, task varchar(255) ); insert into table_list values(1,'ほげほげ1-1'); insert into table_list values(1,'ほげほげ1-2'); insert into table_list values(2,'ほげほげ2-1); insert into table_list values(2,'ほげほげ2-2'); insert into table_list values(3,'ほげほげ3-1'); そして、空のdiv要素が3つあります。 このデータベースからidの数値別に、div要素へtaskの文字列を入れたいのですが、どうすればいいのでしょうか? SQLで「select * from table_list」をやってからtaskを取り出すのか、3回SQLで「select task from table_list where id=1」のようにするのがよろしいんでしょうか?

    • ベストアンサー
    • PHP
  • SQL文について

    SQLite バージョン3.7.10 を使用しています。 次のようなテーブル構造で、 PRAGMA foreign_keys = ON; CREATE TABLE t1 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t1 (key, name) VALUES ('t1_key1', 't1_name1'); INSERT INTO t1 (key, name) VALUES ('t1_key2', 't1_name2'); CREATE TABLE t2 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t2 (key, name) VALUES ('t2_key1', 't2_name1'); INSERT INTO t2 (key, name) VALUES ('t2_key2', 't2_name2'); CREATE TABLE t3 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t3 (key, name) VALUES ('t3_key1', 't3_name1'); INSERT INTO t3 (key, name) VALUES ('t3_key2', 't3_name2'); CREATE TABLE t4 ( year TEXT NOT NULL, t1_key TEXT NOT NULL, t3_key TEXT NOT NULL, percent INTEGER NOT NULL, UNIQUE(year, t1_key, t3_key), FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE, FOREIGN KEY(t3_key) REFERENCES t3(key) ON DELETE CASCADE ); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2011', 't1_key1', 't3_key1', 10); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2012', 't1_key2', 't3_key2', 50); INSERT INTO t4 (year, t1_key, t3_key, percent) VALUES ('2012', 't1_key2', 't3_key1', 100); CREATE TABLE t5 ( no INTEGER PRIMARY KEY AUTOINCREMENT, date TEXT NOT NULL, t1_key TEXT NOT NULL, t2_key TEXT NOT NULL, t3_key TEXT NOT NULL, amount INTEGER NOT NULL, FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE, FOREIGN KEY(t2_key) REFERENCES t2(key) ON DELETE CASCADE, FOREIGN KEY(t3_key) REFERENCES t3(key) ON DELETE CASCADE ); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2011-01-01', 't1_key1', 't2_key1', 't3_key1', 3000); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2011-02-02', 't1_key2', 't2_key1', 't3_key1', 2000); INSERT INTO t5 (date, t1_key, t2_key, t3_key, amount) VALUES ('2012-01-01', 't1_key2', 't2_key1', 't3_key1', 5000); 例えばテーブル「t5」から、 dateカラム=’2011’ t1_keyカラム= (テーブル「t1」のt1_nameカラム=’t1_name1’のt1_key1) t2_keyカラム= (テーブル「t2」のt2_nameカラム=’t2_name1’のt2_key1) という条件の含まれてる全ての対応する行に、 テーブル「t4」のpercentカラムとテーブル「t5」のamountカラムを 掛け合わせた数値の合計を出力する。 ただしテーブル「t4」に対応するt1_keyとt3_keyがなければ、 percentを「0」としてamountと掛ける。 例えばこの条件だと '2011-01-01'と'2011-02-02'の2つの行のamountの合計を求めることになりますが、 '2011-01-01'の方は、テーブル「t4」にpercent「10」があるので 3000×(10/100)=300 '2011-02-02'の方は、テーブル「t4」にpercentがない(対応する行がない)ので 2000×(0/100)=0 合計 300+0=300 という結果が得たいです。 これはどのようなSQL文になるのでしょうか?

  • 指定した条件の組み合わせのSQL文

    SQLite バージョン3.7.10 を使用しています。 以下のようなテーブル構造で、 「t1」テーブルの全ての行と 「t6」テーブルのdateカラムの年の部分を グループ化して全ての組み合わせの 「t6」テーブルのamount の合計を出力したいのですが、 どのようなSQL文を書けば良いのでしょうか? 例えばこのデータ内容なら、以下のような結果が得たいです。 +------+-------+-------+ | year | t1_name | 合計 | +------+-------+-------+ | 2011 |t1_name1|  5000| +------+-------+------+ | 2012 |t1_name1| 10000| +------+-------+------+ | 2012 |t1_name2| 45000| +------+-------+------+ PRAGMA foreign_keys = ON; DROP TABLE IF EXISTS t6; DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( key TEXT PRIMARY KEY NOT NULL, name TEXT NOT NULL UNIQUE ); INSERT INTO t1 (key, name) VALUES ('t1_key1', 't1_name1'); INSERT INTO t1 (key, name) VALUES ('t1_key2', 't1_name2'); CREATE TABLE t6 ( no INTEGER PRIMARY KEY AUTOINCREMENT, t1_key TEXT NOT NULL, date TEXT NOT NULL, amount INTEGER NOT NULL, FOREIGN KEY(t1_key) REFERENCES t1(key) ON DELETE CASCADE ); CREATE INDEX date on t6(date); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key1', '2011-01-01', 5000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key1', '2012-01-01', 10000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key2', '2012-01-01', 15000); INSERT INTO t6 (t1_key, date, amount) VALUES ('t1_key2', '2012-02-01', 30000); http://ideone.com/I1mMba

  • mySQLでINSERT Errorとなります。

    初心者です。よろしくお願いいたします。 データを入れたいのですが、エラーとなってしまいます。 以下でデータベースとテーブルを作成し、 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } $sql = 'CREATE DATABASE tori'; if (mysql_query($sql, $db)) { echo "データベースtori の作成に成功しました\n"; } else { echo 'データベースtoriの作成に失敗しました: ' . mysql_error() . "\n";} mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $query ="create table {$tbl_name} ( id char(8) primary key, date TEXT, sex TEXT, age TEXT )TYPE=MyISAM"; mysql_query($query); $query ="INSERT INTO `houzingpark`.`hatogaya` ( id , date , sex , iro ) VALUES ( '2', 'uu', 'ii', 'po' )"; mysql_close($db); ?> 以下で入れ込みたいのですが、出来ないのです。 <?php $db_name="tori"; $tbl_name = "hato"; $db = mysql_connect('localhost', 'root', ''); if (!$db) { die('接続できません: ' . mysql_error()); } mysql_select_db($db_name,$db) or die("データベースへの接続エラー"); $sql="INSERT INTO hatogaya ( id , date , sex , iro ) VALUES ( 3, 2005-12-3, mesu, cya )"; mysql_query($sql); if(!$result){print 'INSERT Error!';} echo $sql; mysql_close($db); ?> でINSERTしようとするのですが、INSERT Error!と表示されてしまいます。 Adminで見るとデータベースとテーブルは出来ているのですが、どうしてもINSERTできないのです。 もう何時間も悪戦苦闘しております。 どなたかご指導よろしくお願いいたします。

  • PHP+mysql データ重複登録

    ◆PHPバージョン 5.3.3 ◆mysqlバージョン 4.1.22 ◆テーブル情報 `no` int(11) NOT NULL auto_increment, `name` text NOT NULL, `mail` text NOT NULL, `memo` text NOT NULL, `updating` timestamp NOT NULL default CURRENT_TIMESTAMP, PRIMARY KEY (`no`) ENGINE=MyISAM DEFAULT CHARSET=utf8 ◆SQL (1)insert into test(name, mail, memo) values ('abc','abc@test.com','abc') (2)insert test set name='abc', mail='abc@test.com', memo='abc' ◆処理概要 $conn = mysql_connect(ホスト、ユーザ、パスワード); mysql_query("set names utf8"); $rs = mysql_select_db(DB名, $conn); $result = mysql_query(SQL, $conn); ◆登録情報 (1, 'abc', 'abc@test.com', 'abc', '2011-09-02 16:28:57'), (2, '', '', '', '2011-09-02 16:28:57'), 【問題】 上記SQL(1)、(2)どちらでDBに登録しても、登録情報のように同時に空データも同時に登録されてしまう 全く原因の検討がつかないので、何か手がかりがありましたらご教授頂けたらと思います。 どうぞよろしくお願いします。

    • ベストアンサー
    • MySQL
  • uniqueキーをupdateで+1するとERROR 1062: Duplicate entry になる

    create table table1 ( a tinyint unsigned not null, b tinyint unsigned not null, unique index_table1 ( a, b ) ); insert into table1 values('1','1'); insert into table1 values('1','2'); update table1 set b = b+1 where a = '1'; とすると、 ERROR 1062: Duplicate entry '1-2' for key 1 とエラーになってしまいます。 どうやら unique の制約に引っかかっているみたいです。 結果としては 1,2 1,3 になればいいのですが、一個一個bが多い順番にSQLを発行するか、unique 制約を外すしかないんでしょうか? (面倒なので、一発でやりたいのです)

    • ベストアンサー
    • MySQL
  • データが追加されません

    mysql2.23 + PHPのプログラムで あらかじめ次のようなテーブルを作っています。 CREATE TABLE metadata(id smallint unsigned not null auto_increment primary key, me_date datetime, me_info text, me_file varchar (50)); 次にPHPで $meta_server = "metadata"; $conn = mysql_connect("localhost","root","root"); とここまでは大丈夫なのですが、その後 $sql = "INSERT INTO metadata(me_date, me_info, me_file) VALUES( '".substr$table', '".$note."', '".$filename."');"; $db = mysql_db_query($meta_server,$sql); としてもデータがテーブルに入りません。 どこに問題があるのでしょうか? 誰かヒントをお願いします。