第17回 その他のちょっとしたテクニック - MySQL講座

PHP基礎編

サカイ先生のMySQL講座

Lecutures on PHP

第17回 その他のちょっとしたテクニック (その2)

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

2. 間違えるとうるさいピー

  • あの、、、先輩にMySQLを教えてもらうようになってからずっと気になっていたことがあるんですけど・・・・
  • なんだい、改まって。
  • いや、大したことじゃないんですけど(笑)。 MySQL を操作している時にクエリを打ち間違えたりするたびに、PC本体から「ぴーー」って大きな音が鳴るんです。周りにも迷惑かなって思うし、何度も続けて間違えていると近くの先輩がニヤニアしながらこっち見ていたりしてちょっと恥ずかしいですし。。
  • そんなことか。でもその「恥ずかしい」気持ちというのは、次は間違えないようにしようという緊張感にもつながって悪くないことだと思うから、しばらくそのまま使ってもらうおうかな。
  • そんなぁ。。「間違いを減らそう」というモチベーションはいつでも高いので、教えてくださいよぉ。
  • あはは。じゃぁ教えようか。 太郎君は mysql コマンドを使って MySQLサーバに接続する際に、どうやっている?
  • こんな感じで・・・
C:\usr\mysql\bin> mysql -uroot 

で、打ち間違いをしたりすると

mysql> detarame;
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 'detar
ame' at line 1

ほら、こんな音が鳴るんです。

  • 一旦mysqlコマンドを終了(exit)して、こんどは -b というオプションをつけて起動してごらん。
  • はい。
mysql -uroot -b
(略)
mysql> detarame;
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 'detar
ame' at line 1
  • あっ、音が鳴らなくなった! やったぁ、これでどんどん間違えられるぞ!
  • さっきと言っていることが違うぞ(笑)。-b の代わりに --no-beep でもいい。オプションのうちいくつかは、こうやって短い名前と長い名前の両方を持っているんだ。その他のオプションを含め、mysql --help で表示されるから、一通り眺めておくといいね。
  • はい。--help を見ておきます。 あと、この --no-beep とか -b とかって mysql コマンドを起動するたびに毎回指定しなきゃいけないんですか?
  • 太郎君もほどよく「モノグサ」になってきたね。いい傾向だよ。 このオプションは設定ファイルに書いておくこともできる。覚えているかな、設定ファイル。
  • はい。 my.ini ですね。たしか windows ディレクトリの下に置いてあったような・・・・あぁありました。
  • そのファイルの [mysql]セクションの中に no-beep と書いておいたらいい。
  • こんな感じですね。

(my.ini)

[mysql]
default-character-set=cp932
no-beep
  • 保存して、っと。 もう一度やってみます。こんどはいつも通りに、-bとかの指定なしで・・・
C:\usr\mysql\bin>mysql -uroot
(略)
mysql> detarame;
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 'detar
ame' at line 1
  • 音がしなくなりました。やっぱり仕事は静かに進めたいものです。

3. あったら更新、なければ登録

  • ぼくからもひとつ、いいかな。今まで、基本的なデータ操作の SQL として、SELECT, INSERT, UPDATE, DELETE の4つがあるって説明したけど、MySQLにはもうひとつ便利な文があるんだ。
  • うへぇ。まだ増えるんですか。でも大抵の操作はこの4つでできると思うんですけど、あとどんな操作ができるんですか?
  • プログラムの中で「すでにそのデータが存在していたらUPDATEして、なければ新規に作成(INSERT)する」というのを見たことがないかな?
  • あ。あります!
  • あれを一発でできる、REPLACE 文というのがあるんだ。基本的には INSERT 文と同じ構文だ。正確には「あればUPDATE」ではなくて、ある場合は置き換え、、、つまり、今あるものを削除して新しく指定したデータに置き換える、という動作をする。
  • WHERE文で条件を指定して使うんですか?
  • いいや。INSERTと同じような構文だから、WHERE文はないね。「すでに存在」というのは、これ大事だからしっかり覚えておいてほしいのだけど、ユニークキーで判断されるんだ。 今回 items テーブルを例にすると、プライマリーキーがユニークなキーになっているから、このidが一致するものがあれば既存とみなすというわけ。
  • ・・・・・
  • どうやらピンと来ていないようだね。ちょっと例を見せた方がよさそうだな。items テーブルの id が 10番のものと700番のものの2つを例にするよ。
mysql> SELECT * FROM items WHERE id=10;
+----+------------+------------+
| id | name       | base_price |
+----+------------+------------+
| 10 | スーパー53 |       3430 |
+----+------------+------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM items WHERE id=700;
Empty set (0.03 sec)
  • この通り、id=10番は「スーパー53」という商品があり、id=700番は存在していない。

まずid=10のもののnameを 「スーパー53ex」に変更しよう。いや、正確には id=10のものがあるかどうか分からないけどともかくこの新しいデータで置き換えたい(あるいは新規登録したい)というシーンをイメージしたほうがいいかな。 じゃぁ REPLACE を使ってやってみるよ。

mysql> REPLACE INTO items VALUES (10, "スーパー53ex", "3690");
Query OK, 2 rows affected (0.08 sec)

mysql> SELECT * FROM items WHERE id=10;
+----+--------------+------------+
| id | name         | base_price |
+----+--------------+------------+
| 10 | スーパー53ex |       3690 |
+----+--------------+------------+
1 row in set (0.00 sec)
  • あ。nameの値が変わりました。 そうか。 REPLACE は INSERT と同じ構文だから、変更したいところが name だけだったとしても id や base_price なども指定する必要があるのですね。
  • そうだね。 じゃぁ次は id=700 について同じシチュエーションで。これもREPLACEを使ってみる。
mysql> REPLACE INTO items VALUES (700, "テストで追加した商品a", "1280");
Query OK, 1 row affected (0.05 sec)

mysql> SELECT * FROM items WHERE id=700;
+-----+-----------------------+------------+
| id  | name                  | base_price |
+-----+-----------------------+------------+
| 700 | テストで追加した商品a |       1280 |
+-----+-----------------------+------------+
1 row in set (0.00 sec)
  • ほら。さっきはid=700は存在していなかったけど、今、REPLACEで登録できたよね。
  • なるほど、やっと意味がわかりました!

  



Pick Up Q&A

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

>>続きを読む

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

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