質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • MySQL

    7004questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

条件に応じてINSERTを行わないようにするには?

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,907

hojo

score 181

MySQL初心者です。

よくあるプログラミング言語のように条件分岐させて、それぞれ自由な処理を行いたいと思っています。

例えば、条件が1の場合にはuserテーブルに'yamada'を追加しitemテーブルに'car'を追加し、ユーザIDを返す。

また、条件が0の場合には'hanako'のIDを返す。

というような複雑な条件を行うにはどうすれば良いのでしょうか?

CASE WHEN 1  -- 条件分岐
THEN
  SET @id=(SELECT MAX(id) FROM user) + 1;
  INSERT INTO user (id, name, age) values (@id, 'yamada', 45);
  INSERT INTO item (item) values ('car');
  SELECT @id id;
ELSE
  SELECT * FROM user WHERE name = 'hanako';
END

最終的に得たい結果は以下です。

id
432

※ 432はyamadaかhanakoのID

よろしくお願いいたしますm(_ _)m


追記ですが、iwamoto_takaakiさんのおかげで設計方針として条件分岐をデータベースにやらせるのは良くないということを教えていただきました。

ありがとうございます。

そこで、質問を若干修正させて頂きたいのですが、そのような設計がよくないとした上で、ストアドプロシージャを利用しなかった場合に条件分岐させて複数のステートメントを処理させるクエリを発行することはできるのでしょうか?

なぜ設計がよくないのに知りたいのかと言いますと「使わないから知らない」よりも「知った上で使わない」ことの方が良かったと思ったからです。

この質問に回答できる方がいらっしゃいましたら是非教えていただけるとありがたいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • maisumakun

    2017/05/13 08:46

    どのような事情で、それを「MySQLだけで」行わないといけないのでしょうか。

    キャンセル

  • hojo

    2017/05/13 09:26

    例えば条件分岐で利用する値がデータベースが所有している情報である場合、条件分岐をデータベースにさせないとなりますと、一度アプリケーション側でSELECT文などを利用して条件分岐させるための元となる情報を取得する必要が生まれます。 これは一般的な用法なのかもしれませんが、アプリケーションがRDBに発行するクエリの数が増えるために、トータルのWebサービスなりのレスポンス低下の要因になるのではないか?と思いまして、クエリの数を減らすためにMySQLに条件分岐を含む処理をさせたら結果としてレスポンスは向上するのではないか?と思い実験を試みようと思いました。 しかし実験する前にそもそもMySQLで条件分岐させる方法がわかりませんでした。SELECT文の内部でCASE文を利用して条件分岐させる方法はいくつかあったのですが、複数のステートメントをよくあるプログラミング言語のIF文のようにざっくりと条件分岐させる方法がわかりませんでしたので質問させていただきました。

    キャンセル

回答 2

checkベストアンサー

+1

よくあるプログラミング言語のように条件分岐させて、それぞれ自由な処理を行いたいと思っています。

よくあるプログラミング言語を使って条件分岐をする方が良いと思います。

あまり多くはありませんが、ストアド・プロシージャや条件文をSQLに含ませたりする方法は、あまり良い効果があったことが無いのです。その理由を述べます。

一つ目は、SQLで使われる条件式はおまけ的なもので、SQLを複雑にさせるからです。大きく複雑なSQLが扱いづらい点はおそらくご存知だろうと思います。

二つ目は、SQLは検索において複雑なことをするのは問題が少ないのですが、結局それを更新系の処理の元データに使うと、ロジックをSQLに容れることになります。そうすると、ロジックを確認するのにプログラムだけではなくSQLやストアドを調査する必要があります。SQLは意図が読みづらく、プログラムに比べてストアドは表現力低いので読みづらいです。

三つ目は、簡易なプログラムを組むのはストアドとくらべて難しいことは特にないということです。特にORマッピングが出来ていれば、それは顕著になります。

問題は複数回SQLの発行が行われることですが、それで遅くなるのは稀です。遅くなった時まで、そのままにしておくことが大事です。複雑な構成に対応するために、更に複雑な構成になり、調査不能になり、継ぎ接ぎの変更しか許されなくなったプログラムを多く見てきました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/05/13 11:13

    なるほど、納得しました。設計方針として心得るようにしておきます。

    また、質問の技術的な回答としましては「ストアドプロシージャを利用せずに複数のステートメントを条件分岐させることは不可能」という認識でよろしいでしょうか?

    キャンセル

  • 2017/05/13 12:00

    出来る出来ない以前の問題と捉え回答しました。(出来る出来ないの話は「どうだったかな?考えても良い事ないな。」程度)
    SQLで解決すべきは検索の問題で、ロジックではありません。

    特に検索なのか、挿入なのか判別出来ないのは、メソッドであっても避けるべき動作です。

    その点が理解できれば、出来る出来ないの話の元になる問題も存在しないのかと考えです。

    キャンセル

  • 2017/05/13 12:46

    ご返答ありがとうございます。とても参考になりました!

    キャンセル

+1

ストアドプロシージャを使ってみては如何でしょうか?
参考サイト

「MySQL ストアドプロシージャ」等で検索すれば、例は多く出てくると思いますよ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • MySQL

    7004questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。