eyecatch_20151109_mysql

MySQL

MySQL で Select 結果で Update する方法。

2016/12/02

あるテーブルで、姓名カラムを2つ(姓:name_family、名:name_first)と分かれていたのが仕様変更となり、姓名のカラムを name カラム 1つに結合することになりました。

その際、既にインサートされているレコードの「姓」「名」を「姓 名」と全角スペース区切りで結合しつつアップデートする必要がありましたので、備忘録としてその方法をポストします。

Select結果でUpdateする

レコード例

以下の様なテーブルが有るとします。

+---+-------------+------------+
|id | name_family | name_first |
+---+-------------+------------+
| 1 | 織田 | 信長 |
| 2 | 豊臣 | 秀吉 |
| 3 | 徳川 | 家康 |
+---+-------------+------------+

上記レコードを、下の様にしたい場合の方法です。

+---+-------------+------------+------------+
|id | name_family | name_first | name |
+---+-------------+------------+------------+
| 1 | 織田 | 信長 | 織田 信長 |
| 2 | 豊臣 | 秀吉 | 豊臣 秀吉 |
| 3 | 徳川 | 家康 | 徳川 家康 |
+---+-------------+------------+------------+

Update と Concat

答えを書くと、以下のようになります。

あくまで Update文として書き、SET 句でどのカラムを持ってきて上書きするのかを指定します。
WHERE 句では単に同じ id で、という指定です。

文字列の結合には CONCAT を使用。
CONCAT(tbl.name_family, ' ', tbl.name_first) とすることで「姓+全角スペース+名」を実現させます。

既存テーブルの値でアップデートする

RequestテーブルのcolumnAに、OrderテーブルのcolumnBの値を入れたい場合

違うテーブルのレコードを持ってくる場合も以下のようにして実現可能。
requests と orders テーブルを例にしてみます。

なるほどですね。

-MySQL
-, , , , , ,