MySQLでのクエリの質問です。

まず、果物マスタというテーブルがあり、(ID SERIAL,名前 VARCHAR)のような形でデータが格納されているとします。これに値段テーブルというのが別に存在し、(果物ID INT,価格 INT)のようなデータを格納するとします。
値段テーブルにデータを挿入する際、INSERT文で(1(果物ID),100)ではなく、('りんご',100)のように視覚的に分かりやすくデータを挿入する方法はないでしょうか。
なお、果物マスタは当然のごとく増減します(ENUMは使えない)し、値段テーブルには全ての果物の値段は記載されません。
何か良い方法をご存じの方、お教えください。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2011/06/09 11:46:07
  • 終了:2011/06/09 13:33:11

ベストアンサー

id:windofjuly No.5

うぃんど回答回数2625ベストアンサー獲得回数11492011/06/09 13:13:02

ポイント50pt

MySQLのバージョンにもよりますけど5.0以降であれば

一連の動作(SQL)をストアドプロシージャとして登録しておいて

INSERTコマンドの変わりにパラメータ付きで呼び出して実行させるのがシンプルでしょうね

 

「MySQL ストアド」でググればサンプルは色々でてきますので、下記一例

http://thinkit.co.jp/cert/article/0703/13/6/2.htm

id:shinp

ストアドファンクション!その手があったか!

まあ、ぶっちゃけますとENUM自体の便利さは認識しておりましたので、ENUMを動的に変更…つまり、

果物テーブルを(ID,キー,名前)とした上で

値段テーブルを(ENUM,値段)とし、果物トリガーにINSERTされたタイミング値段テーブルをALTERする方法を模索しておりました。(結局できなかった)

SELECTサブクエリを打つ部分を個別にfunctionにしてしまう方が、圧倒的に楽ですね!

エクセル作成の手間より複雑なSQL書く方が楽だと考える弊社にとっては、ぴったりの方法でした! ありがとうございます!

2011/06/09 13:37:47

その他の回答(4件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982011/06/09 12:02:22

ポイント30pt

>('りんご',100)のように視覚的に分かりやすくデータを挿入する方法

SQL文を わかりやすくするために ということですね?

この場合は コメントを使えばいいです。

(1,/*りんご*/,100)

こんな感じで 注釈してやれば わかりやすくなりますよ。

/* が コメントの開始で

*/ ここまで コメントになります。

文中に 使えるコメントです。

id:shinp

かなり良いアイデアだと思いました。手動でクエリを作成しているので、入力の手間がそんな変わらないのは結構良いです。

でも、IDと名前を手動対応させねばならないので、誤入力が怖いです。

2011/06/09 12:34:45
id:dothan No.2

どたん回答回数145ベストアンサー獲得回数252011/06/09 12:15:22

ポイント10pt

SQL文に直接 ('りんご',100) という書き方ができるかどうかという主旨でしたら、できません。せっかく果物マスタを分離した意味が無くなりますから。


入力インターフェースで ('りんご',100) という形にしたいということなら可能です。

UIにHTMLを使うなら、果物マスタをSELECT-OPTIONタグでプルダウンにする方法などが考えられます。

id:shinp

想定としては手でSQL文を作成しているものとお考えください。マスタデータ手動入力(効率悪いですよね、確かに!)の際、面倒くさくなってきたので質問した次第です。

2011/06/09 12:36:16
id:windofjuly No.3

うぃんど回答回数2625ベストアンサー獲得回数11492011/06/09 12:20:13

ポイント10pt

phpなどで入力用フォームを作って、例えば「りんご」と入力された場合には、まずは果物マスタに「りんご」が存在するかどうかを問い合わせ、存在した場合には「りんご」の価格を値段テーブルに書き込むというようなステップを踏んだりします(存在しない場合には果物マスタに追加するかどうかを問い合わせたりということも行ったりします)

従いまして、まずお目にかかることもないと思いますが、どうしてもSQLだけでということであればサブクエリを使って下記のような具合で出来なくはないです

INSERT `値段テーブル` VALUES((SELECT ID FROM `果物マスタ` WHERE `名前`='りんご' LIMIT 0,1), 100);
id:shinp

現在のやり方です。但し、実際に入力するテーブルは

(果物ID,野菜ID,肉ID)のようになっているため、このやり方だと可視性を損ねるどころか見づらくて泣けてくるため、途中で採用するのをやめました。

2011/06/09 12:37:58
id:dothan No.4

どたん回答回数145ベストアンサー獲得回数252011/06/09 13:08:11

ポイント20pt

Excelをお持ちでしたら、果物マスタと値段テーブルを別々のシートに用意し、果物マスタを対象として値段テーブルにリスト入力できるようにしてはいかがでしょう。


RDBMSがCSVのインポートに対応していれば、Excelで作った値段テーブルをインポートするのが最も効率が良いでしょう。

VBAを使って「エクセルでSQL文を自動で出力させたい」の方法でSQL文を生成するやり方もあります。

id:shinp

まあ、時間と余裕があればそうするのですが、その手間を省く(テキストエディタでSQL編集するだけで済む)方法を求めたのが今回の質問でした。

2011/06/09 13:32:11
id:windofjuly No.5

うぃんど回答回数2625ベストアンサー獲得回数11492011/06/09 13:13:02ここでベストアンサー

ポイント50pt

MySQLのバージョンにもよりますけど5.0以降であれば

一連の動作(SQL)をストアドプロシージャとして登録しておいて

INSERTコマンドの変わりにパラメータ付きで呼び出して実行させるのがシンプルでしょうね

 

「MySQL ストアド」でググればサンプルは色々でてきますので、下記一例

http://thinkit.co.jp/cert/article/0703/13/6/2.htm

id:shinp

ストアドファンクション!その手があったか!

まあ、ぶっちゃけますとENUM自体の便利さは認識しておりましたので、ENUMを動的に変更…つまり、

果物テーブルを(ID,キー,名前)とした上で

値段テーブルを(ENUM,値段)とし、果物トリガーにINSERTされたタイミング値段テーブルをALTERする方法を模索しておりました。(結局できなかった)

SELECTサブクエリを打つ部分を個別にfunctionにしてしまう方が、圧倒的に楽ですね!

エクセル作成の手間より複雑なSQL書く方が楽だと考える弊社にとっては、ぴったりの方法でした! ありがとうございます!

2011/06/09 13:37:47

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません