MySQL: レコードの更新と削除 - UPDATE、DELETE文
前回はレコードの検索クエリの作成方法を扱いましたが、今回は既存のレコードのフィールド値を更新するUPDATE文と、レコードを削除するDELETE文の練習をしてみます。
前回はレコードの検索クエリの作成方法を扱いましたが、今回は既存のレコードのフィールド値を更新するUPDATE文と、レコードを削除するDELETE文の練習をしてみます。
前回までにテーブルに一定のデータを追加しましたので、今回はそのデータを検索するクエリ文を以下の場合に分けて練習してみます。
まず、扱うテーブル内のレコードの一覧を下記に示します。
一昨日NHKスペシャル|デジタルネイティブ ~次代を変える若者たち~を見ましたが彼らの行動力って凄い。私もいくつか見習いたい部分がありました。デジタルネイティブの特徴として主に以下の点があるかと思います。
2番目の特徴というのは、Webの情報がまだテキスト主体だった頃、2chの中にもあった文化だったかな。顔の見えない匿名の人間のバックグラウンドよりも掲示板に書いてある内容が重要、って感じで。3,4っ目の特徴は、これは特徴というか番組で紹介されている人達の共通点かと私が感じた項目です。 実名をネットに持ち込むのはメリット・デメリット双方の面があり未だリスクの方が大きいと思い、私はネット上でのブログやコミュニティ活動と本名を紐付けようとまったく思っていませんでした(番組を見るまでは)。それはネットに一度上がってしまった情報は瞬く間に拡散しそれを管理することは技術的に不可能に近いので(使用するサービスにもよりますが)、いったん実名を公開して不都合があったとき、やっぱやーめた、HNで活動しなおすってわけには簡単にはいかない不可逆なところが、実名での活動を躊躇させているのかもしれません。っていうか場合によっては現実生活に悪影響が出ることもありますし。極端な例では犯罪とか。 対して、番組で最初に紹介されたAlchemist Empire, Inc. CEOのAnshul Samar氏(15歳)は化学の教育用カードゲームを開発しネットで販売しています。彼は最初出資してくれる人を探し資金を調達し、開発者を雇うためFace BookなどのSNSをとおしてクリエイターの履歴書や作品を調査しました。そして、目星をつけたデザイナーにカードのイラスト制作を依頼し、また雑誌編集者に説明書の作成を依頼してゲームを完成、販売にこぎつけていました、開発中の連絡方法はメールだったそうです。字面だけ追えば確かに今あるインターネットやSNSがあればできるよね、と感じたと同時に、実際これだけネットと人材を使いこなしビジネスにもっていく行動力とマネジメント手法は凄いと感心しました。 上述の特徴を持っているからこその行動力なのかな。だとすると本当にそれは幼少からネット環境に触れていることで引き起こしたのか、それとも別の要因があるのか、色々検証したいこともあります。そういえば日本では実名によるネットでの活動を行っている人や英語を使える人の割合が低かったような。諸外国ではどうなのだろう。今回の彼はレアケースとして扱われているのか等の周りの反応も今度調べてみよう。 番組の途中ではてなの経営スタイルと近藤社長ついても特集していました。近藤社長へのインタビューの中で、何故ここまでプライベートをWebに公開できるんですか?のくだんかその前後の話しあたりで、「Webの向こう側にも同じ人間がいるので別に~」(ちょっと忘れてしまいました><;離れたところにいる人とつながれるとか、そんな感じの話だったかな)と普通の事のように話していたのが印象として残っています。 最近はビジネス型SNSのCUが始まったり、来年にはLinkedInが日本語の環境や企業データもろもろに対応していくみたいです。実名でWebの活動を行うことによる正負の影響と、仮にそれに抵抗を覚えるとしたらその原因と対処法は何なのかを今一度捉え直してみようかな。
そういえばゲームではありませんが元素や化合物を擬人化するアイディアは左の書籍「元素周期 萌えて覚える化学の基本」も採っていますね。Elementeoより後だけれど。でもなんか面白そう。説明文読んでみたい。 周期表とか見ると以前色鉛筆を使って作成したデータベース・ノートを思い出してなんだか懐かしいです。 話し変わりますが、プログラミングやソフトウェア開発を学べるカードゲームを妄想した。マジック・ザ・ギャザリング風に、 A: 元請予算(=土地カードの一種)をセット!タップして2人月(=マナ)を以って場のClassカードに「デザインパターンActive Object」を適応(カード反転?)!Classの性能、保守力up! B: レスポンス!3人月を以って「闇の自称助っ人コーダー」のタップアビリティを起動!対象のクラスのカプセル化を破壊!デザパタカードを剥ぎ取る。追加効果として相手のターンを1ターン飛ばす(なにこの足を引っ張る効果は)(=納期遅れる、みたいな?)! A: それにスタック乗っけて4人月で「藤田さん」をインスタントとしてプレイ!場に召喚されたときに、俺がコントロールする全てのClassカードはリファクタリングされ、能力と効果の対象にならない! B: 何ぃ!フェずったぜ。 あー色々間違っていますね。 でも複数のクラスカードとインスタンスカウンターと参照カードを合わせてどの業務用アルゴリズムにパターンを構築するかやリファクタリング、合致するかとかのゲームならいけそう(業務知識も学べます、みたいな)?え、まだいけない?また今度考えてみようかな。 参考: 1.デジタルネイティブ度チェック(私は60%でしたf^^;)自己評価もそんな感じなので現時点ではこれでいいかな。あ、なんか今夜再放送するみたいですね。番組の構成や映像クオリティも高いですし、おススメですよ。 2.Elementeo, The Chemistry Card Game Introduction to Elementeo Opening the Elementeo Game Box The Element Card of the Elementeo Game Elemente Level in the Elementeo Game
INSERT文を用いて1レコードを追加する練習をしてみます。 前回までにテーブルの作成と構造の修正を行いましたが、これから使うテーブルは下記のものにします(少しフィールドを削りました)。
HTMLフォームの情報をPOSTメソッドで送信し、送信されたデータをPHPスクリプトで取得しHTMLに埋め込み表示してみます。フォームの各フィールドははformタグ中でinput、select、textareaタグ等を用いて指定します。特にinputタグは下表の様にtype属性が色々あります。
| inputタイプ | type属性 |
|---|---|
| テキスト入力 | type="text" |
| パスワード入力 | type="password" |
| ラジオボタン | type="radio" |
| チェックボックス | type="checkbox" |
| 送信ボタン | type="submit" |
| ボタン | type="buttun" |
フォームデータの送信先はformタグのaction属性で指定します。また、そのときのリクエストメソッドの指定はformタグのmethod属性で指定し、ここではPOSTを用いるのでmethod="post"と記述します。POSTはGETメソッドと異なり特に文字制限はありません。
HTMLフォーム情報の送信テスト
ID:
PASS:
性別:男性 女性
学年: 1年生 2年生 3年生 4年生
所有デジタル機器: PC Cell
コメント:
フォームデータは同ディレクトリに設置したshow_form_data.phpファイルに送信しています。
$value) { $have_dig[$key] = $value; } } $comment = htmlspecialchars($_POST["comment"], ENT_QUOTES); } else { echo "フォームページからアクセスしてください。"; exit(1); } ?> HTMLフォームのPOSTの受信テスト 送信されたデータは、
ID:
PASS:
性別:
学年:年生
所有デジタル機器:
コメント:
POSTリクエストでshow_form_data.phpへアクセスした場合はexit関数でスクリプトを終了します(→PHP: exit - Manual)。 htmlspecialchars関数で特殊文字をエスケープします(→PHP: htmlspecialchars - Manual)。今回はPOSTメソッドに関する練習用スクリプトなのでバリデーション処理は入れていませんが、実際はセキュリティ対策と合わせて色々フィルタするなり、リダイレクトで別ページに誘導するなりの処理が必要です。最近はこの辺の処理をフレームワークで上手くラップしてくれるのでかなり楽になっています。 あと、余談ですがforeach文では操作対象の配列のコピーを作成して、コピーに対して処理していきます。
前回までにCREATE TABLE文を用いて以下のようなbook2テーブルを作成しました。
前回までのUIからは一旦離れて、PaintShopのエアーブラシみたいな機能のみのFlashを書いてみました。以下のページ上でマウスをドラッグをすると赤色の線が引けます。
今回はBitmapクラス周辺の使い方を練習してみましたが、結構知らないことがあり勉強になりました。今回のプログラムは結構雑な作りになってしまったので、後日手直ししてみよう。
さて、最初は単純にユーザの入力文の末尾に予め定義されている文字列を付け足して応答するだけのものです。
package info.yukun.chatterbot;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class SimpleChatterBot {
private String botName = "chatterbot";
private String callStr = "なにかしゃべってよ(>_<)";
private String[] suffixResponses = {
"ってアレですね、わかります(^^)b",
"ですか?わかりません(>_<)",
"って何?日本語でおk('`)b"};
public void go() {
try {
BufferedReader stdReader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("INPUT : ");
String response;
String input;
while ((input = stdReader.readLine()) != null) { // ユーザの入力待ち
if (input.equals("")) { // 入力が無かった
response = callStr;
} else {
response = decorateInput(input) + getSuffixResponse();
}
System.out.print(botName + ": " + response);
System.out.print("\nINPUT : ");
}
stdReader.close();
System.out.println("\nPROGRAM END");
} catch (Exception e) {
e.getStackTrace();
System.exit(-1); // プログラムを終了
}
}
private String getSuffixResponse() {
int rand = (int) (Math.random() * suffixResponses.length);
return suffixResponses[rand];
}
private String decorateInput(String input) {
return "「" + input + "」";
}
public static void main(String[] args) {
SimpleChatterBot bot = new SimpleChatterBot();
bot.go();
}
}
getSuffixResponse()メソッド内で使われているMath.random()は、
static double random() 0.0 以上で、1.0 より小さい正の符号の付いた double 値を返します。
ですので、「Math.random() * 配列の長さ」 は「0~配列の長さ-1」 を意味します。
INPUT : こんにちは
chatterbot: 「こんにちは」って何?日本語でおk('`)b
INPUT : え、
chatterbot: 「え、」ですか?わかりません(>_<)
INPUT : いえ、聞き返しただけです。
chatterbot: 「いえ、聞き返しただけです。」って何?日本語でおk('`)b
INPUT :
chatterbot: なにかしゃべってよ(>_<)
INPUT : 最近どうですか?
chatterbot: 「最近どうですか?」ってアレですね、わかります(^^)b
INPUT :
PROGRAM END
なんだかー、それはかとなくばかにしていますねf^^; 最初はJavaで書いていきますが、実装する機能の種類やリリースする環境によっては恐らく途中でOOをサポートする他の言語に変更するかも。
コマンドプロンプトからキーボード(標準)入力を取得するプログラムです。 肝心の標準入力を取得する手続きはSystem.inフィールドですが、これはバイトストリームでの読み込みを行うメソッドしか持たないので、InputStreamReaderクラスでラップすることでバイトストリームを文字列に変換出来るメソッドに任せます(read()メソッド)。 しかし、InputStreamReader#read()メソッドは一文字毎にしか読み込めず非効率な面があるので、最後にBufferedReaderクラスでラップすることで入力文字をバッファに格納し一行まとめて読み込めるようにします。(readLine()メソッド)。 このように、高水準のコンポーネントにSystem.inのような低水準のコンポーネントを渡して、その中で低水準メソッドを制御する手法はTemplate Methodパターンに通じるものがあるかも。The Open-Closed Principleですね。
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ReadLineSample {
public static void main(String[] args) {
try {
BufferedReader stdReader =
new BufferedReader(new InputStreamReader(System.in));
System.out.print("INPUT : ");
String line;
while ((line = stdReader.readLine()) != null) { // ユーザの一行入力を待つ
if (line.equals("")) line = "<空文字>";
System.out.print("OUTPUT: " + line);
System.out.print("\nINPUT : ");
}
stdReader.close();
System.out.println("\nPROGRAM END");
} catch (Exception e) {
e.getStackTrace();
System.exit(-1); // プログラムを終了
}
}
}
文字列を入力した後Enterキーを押すと入力した文字がOUTPUTされます。
INPUT : Hello World!
OUTPUT: Hello World!
INPUT : こんにちは。
OUTPUT: こんにちは。
INPUT :
OUTPUT: <空文字>
INPUT :
PROGRAM END
プログラムを終了する際は、プロンプト上でCtrl+CかCtrl+Zを押してください。それでreadLine()の戻り値はnullとなりwhileループを抜けます。ここでの注意は、単に文字を何も入力せずEnterキーだけ打つと空文字を返すことです(≠null)。 対して、C言語でこういった処理の場合は環境に合わせた改行文字も読み込こんでいます。たぶん、JavaではInputStreamReaderのreadのどこかの段階でその辺は上手く処理されているのかな?気が向いた時に確認してみようかな。
前回までにCREATE USERとGRANTコマンドでbookshelfデータベースを作成し、それを扱う全権限を持つユーザyukunを追加しました。 今回はCREATE TABLEコマンドでデータベースに新しいテーブルを作成し、それをDESCRIBEコマンドで確認してみます。また、それらに関連する他のコマンドも取り上げてみます。