
【MySQL】Select結果でUpdateするSQLの書き方
2018/03/28
あるテーブルで、姓名カラムを2つ(姓:name_family、名:name_first)と分かれていたのが仕様変更となり、姓名のカラムを name カラム 1つに結合することになりました。
その際、既にインサートされているレコードの「姓」「名」を「姓 名」と全角スペース区切りで結合しつつアップデートする必要がありましたので、備忘録としてその方法をポストします。
Select結果でUpdateする
レコード例
以下の様なテーブルが有るとします。
上記レコードを、下の様にしたい場合の方法です。
Update と Concat
答えを書くと、以下のようになります。
[sql]
UPDATE
profiles
AS tbl
SET
tbl.name = CONCAT(tbl.name_family, ' ', tbl.name_first)
WHERE tbl.id = tbl.id;
[/sql]
あくまで Update文として書き、SET 句でどのカラムを持ってきて上書きするのかを指定します。
WHERE 句では単に同じ id で、という指定です。
文字列の結合には CONCAT を使用。
CONCAT(tbl.name_family, ' ', tbl.name_first) とすることで「姓+全角スペース+名」を実現させます。
別テーブルの値でアップデートする場合
RequestテーブルのcolumnAを、OrderテーブルのcolumnBの値で上書きする
違うテーブルのレコードを持ってくる場合も以下のようにして実現可能。
requests と orders テーブルを例にしてみます。
[sql]
UPDATE
requests
AS req,
orders
AS ord
SET
req.columnA = ord.columnB
WHERE
req.id = ord.request_id;
[/sql]
なるほどですね。