Server

同じレコードがないときだけインサートする!

投稿日:2017年2月28日 更新日:

はじめに

あるアイテムを持っていない人だけ、別のアイテムをあげたい!
もしくはその逆で、あるアイテムを持っている人に追加でアイテムをあげたい!

そういうことってないでしょうか?
先日、僕がそのような状況になり、四苦八苦しておりました。
本日は復習をかねて、調べた内容を記述していきたいと思います。

実行環境

  • MySQL 5.7.14

準備

まずはテスト用のテーブル、レコードを作成しておきます。
実はMySQLのリファレンスを読んだのですが、いまいちピンとこなかったので、実際に似たテーブルを作成して試してみました。

cities(街)、stores(店)、cities_stores(街と店の紐付け)を作成し、それぞれの街にいくつかの店があるとします。
具体的には下記の組み合わせです。

渋谷 セブン、ファミマ、ローソン
新宿 ローソン、ミニストップ、サークルK
池袋 セブン、ローソン、サークルK
どこにもない スーパー

EXISTS / NOT EXISTS

まずは、EXIST句、NOT EXISTS句です。
リファレンスはこちらになります。
これは、その条件のものが存在していればTRUEを、存在していなければFALSEを返し、TRUEのものだけ取得してくれます。
(NOT EXIST句は逆です。)
下記に例を示しますが、storesの中で街にないものは「スーパー」だけです。

セブン、ファミマ、ローソン、ミニストップ、サークルK

スーパー

INSERT … SELECT…

次に、INSERT … SELECT…構文です。
リファレンスはこちらになります。
これは、SELECTで引っ張ってきた値を使用してINSERT文を作成します。
具体的には下記です。
良い例が思いつかなかったため、storesから全件取得し、それをcitiesに突っ込みます。

ご想像の通り、これでまるっとcitiesのレコードが増えます。

id name
1 渋谷
2 新宿
3 池袋
4 セブンイレブン
5 ファミリーマート
6 ローソン
7 ミニストップ
8 サークルK
9 スーパー

同じレコードがないときだけインサートする!

ここから本題になります。
想定としては、ある街に全ての店が進出してきた!ということにします。(意味が分かりませんが笑)
当然、既に存在している店もあるので、その店はインサートしないようにしたいです。
NOT EXISTS句とINSERT … SELECT …構文を併用して下記のように書きます。
(例として、渋谷にセブンイレブンとファミリーマートがきたということにします。セブンは既に存在しています。)

dualはテーブルを参照する必要のない場合に使用するダミーテーブルで、WHERE句を指定したい場合などに入れる必要があるそうです。
MySQLリファレンス-SELECT Syntax-
私自身は特に省略しても違和感はありませんが、Oracle データベースなどを扱っていた方々は 記述するのが当たり前のようです。

とりあえずSQL文はできましたが、これだとレコード数が少ない場合は良いのですが、
レコード数が多くなると面倒なので、ストアドプロシージャを使用してループ文を作りたいと思います。
ストアドプロシージャは機会があればいろいろ試して、ブログにしたいと思いますが、今回はコードだけ載せておきます。
MySQLリファレンス-CREATE PROCEDURE and CREATE FUNCTION Syntax-

これでRegisterAllStoresWithCity()が登録されたので、下記で呼び出し、インサートしてみます。

これで、渋谷に全ての店が出店できました!

id cities.name stores.name
1 渋谷 セブンイレブン
2 渋谷 ファミリーマート
3 渋谷 ローソン
25 渋谷 ミニストップ
26 渋谷 サークルK
27 渋谷 スーパー

余談ですが、登録したRegisterAllStoresWithCityをリセットするには下記コマンドになるそうです。

blog-page_footer_336




blog-page_footer_336




-Server
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

DockerのQuickstart:Compose and Railsをやってみた

1 はじめに1.1 環境1.2 Docker for Macのインストール2 Railsプロジェクトを作成するまで2.1 Railsのプロジェクトディレクトリの作成2.2 Dockerfileの作成2 ...

aws

AWS App RunnerでWebサーバをデプロイしてみる

1 はじめに1.1 今回の記事で行うこと2 AWS App Runnerとは3 App Runnerでコンテナをデプロイする3.1 ステップ1「ソースおよびデプロイ」3.1.1 ソースの設定3.1.2 ...

DockerでLAMP環境をつくり、LimeSurveyを動かしてみた

1 はじめに2 Docker関連ファイルの作成2.1 docker-compose.yml2.2 MySQL2.2.1 個人的に詰まったこと2.3 PHP3 Docker起動4 リポジトリを作りました ...

RubyでOSM Nominatimを使ってみた

1 はじめに2 導入3 検索3.1 建物名による検索の実装例3.2 住所による検索の実装例4 リバースジオコーディング4.1 実装例5 住所の整形6 Open Street Map Nominatim ...

aws

EventBridge Pipesを使ってSQSからECSタスクを起動する

1 はじめに2 EventBridge Pipesとは2.1 ソース2.2 フィルタリング2.3 エンリッチメント2.4 ターゲット3 EventBridge Pipesを使うメリット4 EventB ...

フォロー

blog-page_side_responsive

2017年2月
 1234
567891011
12131415161718
19202122232425
262728  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。