• ベストアンサー
  • 困ってます

MySQL SELECTの指定について

まず、御覧頂きありがとうございます。 早速質問なのですが、 CREATE TABLE `hoge` ( `id` int(8) NOT NULL, `name` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `hoge` (`id`, `name`) VALUES (1, 'hogeA'), (2, 'hogeB'), (3, 'hogeC'), (4, 'hogeD'); CREATE TABLE `test` ( `id` int(8) NOT NULL, `name` varchar(30) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test` (`id`, `name`) VALUES (1, 'testA'), (4, 'testD'); という値が入ってるテーブルがあるとします。(長くなってすみません) で、 hoge.id と test.id が重複した場合 test.name を表示させたいです。 期待値としては id,name 1.testA 2,hogeB 3,hogeC 4,testD になります。 業務でJoinを使うようなテーブル構造にそもそもしないというのもあり、クリティカルなSQLコードに不慣れで御知恵を借りたく質問させて頂きました。 よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数90
  • ありがとう数16

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

  • ベストアンサー
  • 回答No.2
  • root139
  • ベストアンサー率60% (488/809)

OUTER JOIN して COALESCE で選択する方法も有りますね。 ただし、MySQLでは FULL OUTER JOIN が使えないので、LEFT OUTER JOIN と RIGHT OUTER JOIN を UNION する必要が有りますが。 SELECT id, COALESCE(test.name, hoge.name) AS name FROM hoge LEFT OUTER JOIN test USING(id) UNION SELECT id, COALESCE(test.name, hoge.name) AS name FROM hoge RIGHT OUTER JOIN test USING(id); もし、test の中の id が全て hoge にも有るのでしたら、↓だけでも良いです。 SELECT id, COALESCE(test.name, hoge.name) AS name FROM hoge LEFT OUTER JOIN test USING(id); http://dev.mysql.com/doc/refman/5.1/ja/join.html http://dev.mysql.com/doc/refman/5.1/ja/comparison-operators.html#function_coalesce

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。 大変参考になりました。

関連するQ&A

  • PHPとMysqlを使用した集計表の作り方

    --------------媒体-------------- CREATE TABLE IF NOT EXISTS `media` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; INSERT INTO `media` (`id`, `name`) VALUES (1, 'yahoo'), (2, '楽天'), (3, '電話'), (4, 'メール'), (5, 'その他'); --------------店舗-------------- CREATE TABLE IF NOT EXISTS `shop` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(50) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; INSERT INTO `shop` (`id`, `name`) VALUES (1, '新宿'), (2, '池袋'), (3, '渋谷'), (4, '博多'), (5, '梅田'); --------------来客数-------------- CREATE TABLE IF NOT EXISTS `raikyakusuu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `date` date DEFAULT NULL, `shop_id` int(2) DEFAULT NULL, `media_id` int(2) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8; INSERT INTO `raikyakusuu` (`id`, `date`, `shop_id`, `media_id`) VALUES (1, '2013-11-01', 1, 1), (2, '2013-11-01', 1, 1), (3, '2013-11-01', 1, 2), (4, '2013-11-01', 4, 4), (5, '2013-11-01', 1, 2), (6, '2013-11-02', 3, 1), (8, '2013-11-02', 3, 4), (9, '2013-11-02', 2, 2), (10, '2013-11-02', 2, 4), (11, '2013-11-03', 1, 4), (12, '2013-11-03', 3, 1), (13, '2013-11-05', 4, 3), (14, '2013-11-05', 1, 3), (15, '2013-11-06', 2, 2), (16, '2013-11-06', 3, 3), (17, '2013-11-06', 1, 5); select DATE_FORMAT(r.`date`,'%d日') as DayTime, count(*) as cnt, s.`name` as s_name, m.`name` as m_name from raikyakusuu r LEFT JOIN shop s ON s.`id` = r.`shop_id` LEFT JOIN media m ON m.`id` = r.`media_id` WHERE DATE_FORMAT(r.`date`, '%Y-%m') = '2013-11' GROUP BY DayTime, m.`name` 上記のセレクト文で取れた結果をPHPにて 新宿 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楽天 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | メール | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 池袋 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 楽天 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | メール | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 渋谷 媒体 |01日|02日|03日|04日|05日|06日|07日|08日|・・・ yahoo | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 楽天 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 電話 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | メール | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | その他 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | といったようにtableにて表示を考えておりますが、 うまくだせずに困っております。 条件といたしましては、 結果で取れていない媒体、日付も表示させ、cntには0と表示させたいです。 お分かりの方がいらっしゃいましたらご教示お願いいたします。 端折らせていただいている部分も御座いますが、宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • 最初に挿入された行だけ取得したい

    このジャンルでお願いします。 次のようなテーブルで CREATE TABLE IF NOT EXISTS user ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user (name) VALUES ('user1'); INSERT INTO user (name) VALUES ('user2'); INSERT INTO user (name) VALUES ('user3'); CREATE TABLE IF NOT EXISTS item ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO item (name) VALUES ('item1'); INSERT INTO item (name) VALUES ('item2'); INSERT INTO item (name) VALUES ('item3'); CREATE TABLE IF NOT EXISTS user_item ( id int(11) NOT NULL AUTO_INCREMENT, user_id INT, item_id INT, PRIMARY KEY(id), FOREIGN KEY (item_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (user_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user_item (user_id, item_id) VALUES (1, 1); INSERT INTO user_item (user_id, item_id) VALUES (2, 1); INSERT INTO user_item (user_id, item_id) VALUES (3, 2); INSERT INTO user_item (user_id, item_id) VALUES (1, 2); INSERT INTO user_item (user_id, item_id) VALUES (1, 3); INSERT INTO user_item (user_id, item_id) VALUES (3, 3); user_itemテーブルでのselectで、 user_idが1で一番最初に挿入された行だけ を取得したいのですが、どのようなSQL文にすれば良いのでしょうか? この例なら INSERT INTO user_item (user_id, item_id) VALUES (1, 1);←取得 INSERT INTO user_item (user_id, item_id) VALUES (2, 1); INSERT INTO user_item (user_id, item_id) VALUES (3, 2); INSERT INTO user_item (user_id, item_id) VALUES (1, 2);←user_id=3が最初に挿入されているので取得しない INSERT INTO user_item (user_id, item_id) VALUES (1, 3);←取得 INSERT INTO user_item (user_id, item_id) VALUES (3, 3);

    • ベストアンサー
    • MySQL
  • Using temporary; Using filesort を回避したい

    はじめまして。よろしくお願いします。 下記の場合、Using temporary; Using filesort を回避するには どうしたらよいでしょうか。 次の 2 つのテーブルがあります。 CREATE TABLE `test1` ( `f1` int(11) NOT NULL, `f2` int(11) NOT NULL, PRIMARY KEY (`f1`,`f2`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test1` VALUES ('1', '2'); INSERT INTO `test1` VALUES ('1', '3'); INSERT INTO `test1` VALUES ('1', '4'); INSERT INTO `test1` VALUES ('2', '1'); INSERT INTO `test1` VALUES ('2', '3'); CREATE TABLE `test2` ( `f1` int(11) NOT NULL, `f2` varchar(20) default NULL, `f3` varchar(20) default NULL, PRIMARY KEY (`f1`), KEY `ix_f2_f3` (`f2`,`f3`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `test2` VALUES ('1', 'A', 'a'); INSERT INTO `test2` VALUES ('2', 'B', 'b'); INSERT INTO `test2` VALUES ('3', 'C', 'c'); INSERT INTO `test2` VALUES ('4', 'D', 'd'); 次の SELECT を実行すると Using temporary; Using filesort が 現れてしまいます。 explain select test2.f2, test2.f3 from test1, test2 where test1.f1 = 1 and test1.f2 = test2.f1 order by test2.f2, test2.f3; order by ... をなくすと問題ないのですが、ソートは必要です。 複数のキーに対してORDER BYを実行する場合 インデックスを使用できないとあるので ix_f2_f3 は使用されず Using filesort となるのはわかるのですが、 Using temporary となる理由と回避方法がわかりません。 ご教示よろしくおねがいいたします。

その他の回答 (2)

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

単純にunionでidの一覧をつくって それぞれをleft joinすればいいような気がしますが select t1.id,coalesce(t3.name,t2.name) as name from (SELECT id FROM hoge UNION SELECT id FROM test) as t1 left join hoge as t2 on t1.id=t2.id left join test as t3 on t1.id=t3.id

共感・感謝の気持ちを伝えよう!

質問者からのお礼

返事が遅れてすみませんでした。 大変参考になりました。

  • 回答No.1

select id ,name from hoge where id not in (select id from test) union select id,name from test order by 1

共感・感謝の気持ちを伝えよう!

質問者からのお礼

返事が遅れてすみませんでした。 大変参考になりました。

関連するQ&A

  • Update文の書き方について

    下記のデータベースで『nameフィールドに値がセットされているもののみ』、別の文字に置き換えたいと思いますが、例えば『UPDATE `test` SET `name` = "かきくけ";』のような書き方ではnameフィールドのすべてのレコードを更新してしまいます。 その為、上記SQL文のSET以降で『nameフィールドに値がセットされているもののみ』という条件を付加すれば良いと思ったのですが、どのようなSQL文を書けば良いか分からなかった為、アドバイスいただける方がいらっしゃいましたら、ご教示の程よろしくお願いします。 CREATE TABLE IF NOT EXISTS `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(64) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ; INSERT INTO `test` (`id`, `name`) VALUES (1, 'あいうえお'), (2, ''), (3, 'さしす'), (4, ''), (5, 'ab'); 以上、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 階層構造のテーブルの行の取得について

    このジャンルでお願いします。 次のようなテーブルで CREATE TABLE IF NOT EXISTS user ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user (name) VALUES ('user1'); INSERT INTO user (name) VALUES ('user2'); INSERT INTO user (name) VALUES ('user3'); CREATE TABLE IF NOT EXISTS item ( id int(11) NOT NULL AUTO_INCREMENT, parent_id INT, name varchar(32) NOT NULL, FOREIGN KEY (parent_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); INSERT INTO item (parent_id, name) VALUES (null, 'item6'); INSERT INTO item (parent_id, name) VALUES (6, 'item7'); INSERT INTO item (parent_id, name) VALUES (null, 'item8'); CREATE TABLE IF NOT EXISTS user_item ( id int(11) NOT NULL AUTO_INCREMENT, user_id INT, item_id INT, type varchar(16) NOT NULL, PRIMARY KEY(id), FOREIGN KEY (user_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (item_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO user_item (user_id, item_id, type) VALUES (1, 1, 'allow'); INSERT INTO user_item (user_id, item_id, type) VALUES (1, 3, 'deny'); INSERT INTO user_item (user_id, item_id, type) VALUES (1, 7, 'allow'); user_itemのuser_idが1のitemの行を取得したいのですが、 その条件として ・user_itemテーブルのtypeが'allow'のitem_id以下のitemの行 ・ただしtypeが'deny'のitem_id以下の行は除く この例だと、user_itemの INSERT INTO user_item (user_id, item_id, type) VALUES (1, 1, 'allow'); の行によってitemテーブルの INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); が取得候補になりますが、 INSERT INTO user_item (user_id, item_id, type) VALUES (1, 3, 'deny'); によって INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); の行は除かれ、 INSERT INTO item (parent_id, name) VALUES (null, 'item1'); INSERT INTO item (parent_id, name) VALUES (1, 'item2'); INSERT INTO item (parent_id, name) VALUES (2, 'item5'); の行が取得されます。 つまりitemテーブルにおいて上の階層の直近の(user_itemと結合して取得した)typeが 'allow'である場合のみ取得したいのです。 INSERT INTO item (parent_id, name) VALUES (null, 'item1');←取得 INSERT INTO item (parent_id, name) VALUES (1, 'item2');←取得 INSERT INTO item (parent_id, name) VALUES (2, 'item3'); INSERT INTO item (parent_id, name) VALUES (3, 'item4'); INSERT INTO item (parent_id, name) VALUES (2, 'item5');←取得 INSERT INTO item (parent_id, name) VALUES (null, 'item6'); INSERT INTO item (parent_id, name) VALUES (6, 'item7');←取得 INSERT INTO item (parent_id, name) VALUES (null, 'item8'); 複雑ではありますが、これはどのようなSQL文にすれば良いのでしょうか?

    • ベストアンサー
    • MySQL
  • 閉包テーブルのノードの移行について

    このジャンルでお願いします。 次のようなテーブルで CREATE TABLE IF NOT EXISTS item ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(32) NOT NULL, PRIMARY KEY(id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO item (name) VALUES ('item1'); INSERT INTO item (name) VALUES ('item2'); INSERT INTO item (name) VALUES ('item3'); INSERT INTO item (name) VALUES ('item4'); INSERT INTO item (name) VALUES ('item5'); INSERT INTO item (name) VALUES ('item6'); CREATE TABLE IF NOT EXISTS treepath ( ancestor_id int(11) NOT NULL, descendant_id int(11) NOT NULL, FOREIGN KEY (ancestor_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE, FOREIGN KEY (descendant_id) REFERENCES item(id) ON DELETE CASCADE ON UPDATE CASCADE, PRIMARY KEY(ancestor_id, descendant_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO treepath (ancestor_id, descendant_id) VALUES (1, 1); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (1, 2); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (1, 3); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (1, 4); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (1, 5); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (1, 6); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (2, 2); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (2, 4); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (2, 5); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (2, 6); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (3, 3); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (4, 4); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (4, 6); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (5, 5); INSERT INTO treepath (ancestor_id, descendant_id) VALUES (6, 6); item1┬item2    │ ├item4    │ │  └item6    │ └item5    │    └item3 を item1┬item2    │ │      │ └item5    │    └item3      └item4        └item6 のようにitem4以下のノードをitem3の下に移したいのですが、 その場合のtreepathテーブルの更新はどのようなSQL文にすれば良いのでしょうか?

    • ベストアンサー
    • MySQL
  • SQL文でダブルクォートか

    SQL文でダブルクォートかアポストロフィーか迷っています!?  以下のSQL文の  name varchar(30) not null default " ,等の  最後から2番目に " ダブルクォートがあります。  教本を見ながら入力したのですが、' ' アポストロフィーが2個あるようにも見えます。 この場合、どちらが正規でしょうか!    以下問題のSQL文です。  よろしくお願いします。 CREATE DATABASE xmas; USE xmas; book_id int not null auto_increment, name varchar(30) not null default " , org varchar(50) not null default ", addr varchar(80) not null default", tel varchar(20) default ", mail varchar(40) default ", course varchar(30) default ", nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    • ベストアンサー
    • MySQL
  • 存在しないレコードの抽出方法について

    table_aに存在するidのうち、table_bには存在しないidを抽出するSLQ文を作成したいと思ったのですが、抽出方法が分からなかったので、アドバイスいただける方がいらっしゃいましたら、ご教示いただけたらと思います。 下記の例では、table_aには、101~106までのidがあるのに対し、table_bには101,102,104のidがあるため、103,105,106を抽出したいと思います。 CREATE TABLE IF NOT EXISTS `table_a` ( `auto_id` int(11) NOT NULL, `id` varchar(7) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `table_a` (`auto_id`, `id`) VALUES (1, '101'), (2, '102'), (3, '103'), (4, '104'), (5, '105'), (6, '106'); CREATE TABLE IF NOT EXISTS `table_b` ( `auto_id` int(11) NOT NULL, `id` varchar(7) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `table_b` (`auto_id`, `id`) VALUES (1, '101'), (2, '102'), (3, '102'), (4, '102'), (5, '104'), (6, '104'); 以上、よろしくお願いします。

    • ベストアンサー
    • MySQL
  • SQLにプログラムが反映されないのは何故

    XAMPP Version: 1.8.2 です。   Xamsのデータベースをデータベースから削除した後  SQLから、以下2個プログラムを入力しました。  すると、削除したにも関わらず、エラーが出て プログラムが反映されません。  Xamsを削除後、再起動したらまたXamsのデータベースが 再構築されます。  私は作成した記憶はありません。  すでに存在しているので、作成しする必要は ないのか、よくわかりません!?  皆様どう思われますか!?  以下入力したプログラムです。 ---------------------------------------------------------------- CREATE DATABASE xmas; USE xmas; CREATE TABLE xmastran ( book_id int not null auto_increment, name varchar(30) not null default '' , org varchar(50) not null default '', addr varchar(80) not null default'', tel varchar(20) default '', mail varchar(40) default '', course varchar(30) default '', nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; エラー 実行したSQL: DATABASEクリスマスを作成します。 のMySQLのメッセージ:ドキュメント #1007 - データベース'クリスマス'を作成できません、データベースが存在している -------------------------------------------------- CREATE DATABASE if not exists xmas; USE xmas; CREATE TABLE xmastran ( book_id int not null auto_increment, name varchar(30) not null default '' , org varchar(50) not null default '', addr varchar(80) not null default'', tel varchar(20) default '', mail varchar(40) default '', course varchar(30) default '', nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; エラー 実行したSQL: TABLE xmastranを(CREATE book_idのINT NOT NULL AUTO_INCREMENT、 名VARCHAR(30)NOT NULL DEFAULT''を、 orgのVARCHAR(50)NOT NULL DEFAULT''を、 addrはVARCHAR(80)NOT NULL DEFAULT''を、 電話VARCHAR(20)DEFAULT''を、 メールVARCHAR(40)DEFAULT''を、 もちろんVARCHAR(30)DEFAULT''を、 numsはINTEGERのデフォルトは0、 PRIMARY KEY(book_id) )ENGINE = MYISAM DEFAULT CHARSET= utf8を; のMySQLのメッセージ:ドキュメント #1050 - テーブル 'xmastran'は既に存在します。 ------------------------------------------------------------------- 以上よろしくお願いします。

    • ベストアンサー
    • 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
  • sql文について

    phpとmysqlの参考書を購入したのですがわからないことがあり 質問させてください。 参考書のサンプルとしてsample.sqlには以下の内容があります。 CREATE TABLE IF NOT EXISTS `author` ( `author_id` int(11) NOT NULL auto_increment, `author_name` varchar(255) NOT NULL default '', `author_name_kana` varchar(255) NOT NULL default '', `state` int(11) NOT NULL default '0', `description` text NOT NULL, PRIMARY KEY (`author_id`), KEY `author_name` (`author_name`), KEY `author_name_kana` (`author_name_kana`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; PRIMARY KEY (`author_id`),まではわかるのですがそれ以下の KEY ・・・とはなんのためにあり何をするのでしょうか? PRIMARY KEY・・・は主キーをauthor_idにするという設定かと 思うのですがKEY ・・・について意味がわかりません。 基本的すぎる事なのか参考書に説明がありませんでした^^; 詳しい方おりましたらわかりやすく教えて頂けますと幸いです。 宜しくお願い致します。

  • SQL文を入力したらエラー

     phpMyAdminでSQLに  以下の文を入力しました。  CREATE DATABASE xmas; USE xmas; CREATE TABLE xmastran ( book_id int not null auto_increment, name varchar(30) not null default ' ' , org varchar(50) not null default ' ', addr varchar(80) not null default' ', tel varchar(20) default ' ', mail varchar(40) default ' ', course varchar(30) default ' ', nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;  以上SQLに入力した文ですが!  以下のエラーが出て先に進みません。   エラー 実行した SQL: CREATE DATABASE xmas; → (http://dev.mysql.com/doc/refman/5.5/en/create-database.htmlにリンクされている) MySQL のメッセージ: ドキュメント #1007 - Can't create database 'xmas'; database exists サーバ "127.0.0.1" 上でクエリを実行する: CREATE DATABASE xmas; USE xmas; CREATE TABLE xmastran ( book_id int not null auto_increment, name varchar(30) not null default ' ' , org varchar(50) not null default ' ', addr varchar(80) not null default' ', tel varchar(20) default ' ', mail varchar(40) default ' ', course varchar(30) default ' ', nums integer default 0, PRIMARY KEY (book_id) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;   以上ですが、何が原因で進めないか原因を追及中です。  最近SQLを始めたので、全く見当がつきません。 皆様よろしくお願いします。  

    • ベストアンサー
    • MySQL
  • mysqlのインデックスについて質問です。

    mysqlのインデックスについて質問です。 http://archiva.jp/web/server-side/sql_02.html に、 『mysqlでは1つのクエリ実行で、1つのテーブルにつき1つのインデックスしか使用できない』 とあります。 よく以下のようなテーブル定義を見かけますが、 CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; idとuser_idを条件にするクエリであれば、上記制約を満たすため、 KEY `id_user_id_idx` (`id`,`user_id`) の複合クエリを定義すれば良いのでしょうか? また、idとuser_idとfile_idを条件にするクエリも考慮に入れた場合、 テーブル定義は以下のようにするのでしょうか? CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `id_user_id_idx` (`id`,`user_id`), KEY `id_user_id_file_id_idx` (`id`,`user_id`,`file_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 最後に、create table 時のインデックスの指定は、 INDEX `user_id` (`user_id`), のようにもできますが、INDEXとKEYの違いは何かあるのでしょうか。

    • ベストアンサー
    • MySQL