第16回 テーブル定義の変更と応用練習 - MySQL講座

PHP基礎編

サカイ先生のMySQL講座

Lecutures on PHP

第16回 テーブル定義の変更と応用練習 (その3)

 このエントリーをはてなブックマークに追加

都道府県テーブル定義の変更(データ投入編)

  • それじゃ次はデータの登録をするよ。「4. データの投入」だ。
  • なんか今日の先輩、いつもにも増してチャキチャキしていますね(笑)。
  • やることいっぱいあるから、どんどん進まないと日が暮れちゃうからね。って、もう日は暮れているけど(笑)。 さて、太郎君がみつけてきてくれたデータを prefecture テーブルに入れよう。いま prefecture テーブルの population カラムがどんなふうになっているかな。
  • そういえば、テーブル定義は確認したけど中のデータは見ていませんでしたね。見てみます。
mysql> SELECT * FROM prefecture;
+------+----------+------------+
| code | name     | population |
+------+----------+------------+
| 01   | 北海道   |       NULL |
| 02   | 青森県   |       NULL |
:(略) 
| 46   | 鹿児島県 |       NULL |
| 47   | 沖縄県   |       NULL |
+------+----------+------------+
47 rows in set (0.00 sec)

population カラムには NULL って値が入っていますね。

  • そう。まぁ、正確には NULL は "値" ではないんだけどね。

じゃ、このカラムを人口の数字で更新するための構文はどう?

  • えぇと、、、、 UPDATE を使って、、、、、
UPDATE prefecture SET population=[人口] WHERE name="[都道府県名]"; 

これでどうでしょう。

  • それでもいいけど、、、、。さっきのサイトから太郎君が取ってきたデータ、どんな風になっているか見せてくれるかな。
  • はい。こんな感じで用意しました。
北海道	5,570 
青森	1,407 
岩手	1,364 
宮城	2,347 
秋田	1,121 
山形	1,198 
福島	2,067 
茨城	2,969 
栃木	2,014 
群馬	2,016 
埼玉	7,090 
千葉	6,098 
 :
  • このままだとWHEREに書いた [都道府県名] がマッチしないね。ほら、我々が持っているデータは「県」とか「都」とかがついているだろう?
  • 本当だ。 WHERE name="秋田" とやっても更新してくれないってことなのですね。
  • これも僕の経験上の話なんだけど、更新条件の指定、つまりWHERE句でマッチさせるカラムはできれば文字列じゃないほうがいいと思っているんだ。

今回みたいに人間にとっては「茨城」も「茨城県」も同じように理解できるものでも、SQLでは厳密に一致するかしないかを判断するし、同じに見える字でも異字体だったりすることがあるなど、特に漢字などのマッチングでは作業上のミスが起きやすい。

だから僕は、可能であれば文字列ではなくコード類のカラムを使って更新条件を指定するように心がけているんだよ。

  • なるほど。ということは先ほどのSQLは、こうしたほうがいいのですね。
UPDATE prefecture SET population=[人口] WHERE code="[都道府県コード]"; 

先ほどの都道府県データも書き換えてみました。都道府県コードをつけたのと、人口が x1000 だったはずなので、実際の人口の数字にしました。

01 北海道 5570000
02 青森   1407000
03 岩手   1364000
04 宮城   2347000
05 秋田   1121000
06 山形   1198000
07 福島   2067000
08 茨城   2969000
09 栃木   2014000
10 群馬   2016000
11 埼玉   7090000
12 千葉   6098000
 :
  • うん。いいね。じゃぁこれを使って文字列加工でさっきのSQLひな形に当てはめてよ。
  • はい。(ごりごりごりごり)

できました。これです。

UPDATE prefecture SET population=5570000   WHERE code='01';
UPDATE prefecture SET population=1407000   WHERE code='02';
UPDATE prefecture SET population=1364000   WHERE code='03';
UPDATE prefecture SET population=2347000   WHERE code='04';
UPDATE prefecture SET population=1121000   WHERE code='05';
UPDATE prefecture SET population=1198000   WHERE code='06';
UPDATE prefecture SET population=2067000   WHERE code='07';
UPDATE prefecture SET population=2969000   WHERE code='08';
UPDATE prefecture SET population=2014000   WHERE code='09';
UPDATE prefecture SET population=2016000   WHERE code='10';
UPDATE prefecture SET population=7090000   WHERE code='11';
UPDATE prefecture SET population=6098000   WHERE code='12';
UPDATE prefecture SET population=12758000  WHERE code='13';
UPDATE prefecture SET population=8880000   WHERE code='14';
UPDATE prefecture SET population=2405000   WHERE code='15';
UPDATE prefecture SET population=1106000   WHERE code='16';
UPDATE prefecture SET population=1170000   WHERE code='17';
UPDATE prefecture SET population=816000    WHERE code='18';
UPDATE prefecture SET population=877000    WHERE code='19';
UPDATE prefecture SET population=2180000   WHERE code='20';
UPDATE prefecture SET population=2104000   WHERE code='21';
UPDATE prefecture SET population=3801000   WHERE code='22';
UPDATE prefecture SET population=7360000   WHERE code='23';
UPDATE prefecture SET population=1876000   WHERE code='24';
UPDATE prefecture SET population=1396000   WHERE code='25';
UPDATE prefecture SET population=2635000   WHERE code='26';
UPDATE prefecture SET population=8812000   WHERE code='27';
UPDATE prefecture SET population=5589000   WHERE code='28';
UPDATE prefecture SET population=1410000   WHERE code='29';
UPDATE prefecture SET population=1019000   WHERE code='30';
UPDATE prefecture SET population=600000    WHERE code='31';
UPDATE prefecture SET population=731000    WHERE code='32';
UPDATE prefecture SET population=1953000   WHERE code='33';
UPDATE prefecture SET population=2873000   WHERE code='34';
UPDATE prefecture SET population=1474000   WHERE code='35';
UPDATE prefecture SET population=800000    WHERE code='36';
UPDATE prefecture SET population=1006000   WHERE code='37';
UPDATE prefecture SET population=1452000   WHERE code='38';
UPDATE prefecture SET population=782000    WHERE code='39';
UPDATE prefecture SET population=5056000   WHERE code='40';
UPDATE prefecture SET population=859000    WHERE code='41';
UPDATE prefecture SET population=1453000   WHERE code='42';
UPDATE prefecture SET population=1828000   WHERE code='43';
UPDATE prefecture SET population=1203000   WHERE code='44';
UPDATE prefecture SET population=1143000   WHERE code='45';
UPDATE prefecture SET population=1730000   WHERE code='46';
UPDATE prefecture SET population=1373000   WHERE code='47';
  • よさそうだから、これを mysql コマンドに流し込んで実行しようか。
  • はい。チャキチャキ!(笑)

実行しました。内容確認してみます。

mysql> SELECT * FROM prefecture;
+------+----------+------------+
| code | name     | population |
+------+----------+------------+
| 01   | 北海道   |    5570000 |
| 02   | 青森県   |    1407000 |
:(略) 
| 46   | 鹿児島県 |    1730000 |
| 47   | 沖縄県   |    1373000 |
+------+----------+------------+
47 rows in set (0.00 sec)
  • いくつか目視でデータの数字を確認してみましたが、正しく登録されているようです。
  • オッケー。

  



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)