MySQLで、selectした結果でupdateする

このトピックってなぁ、「データベースを少し知っている人は超簡単だと思う」、「データベースをとても知っている人は「難しいことを知っている」」有名なネタなのね。

聞きかじり程度、もしくは「たまにしかデータベース使わない」あるいは「一種類の DBMS だけ使ったことがある」くらいだと、「難しいわけないじゃん」と思うんだねぇ。ところがこれ、DBMS ごとに全部やり方が違う。あとね、PostgreSQL なんかがそうなんだけど、UPDATE 対象のレコードに対して SELECT 結果が複数件ヒットした場合にハマることが多かったりとか。このことはSQLクックブック ―データベースエキスパートのための実践レシピ集に詳しく書いてある。

MySQLにご用事があって、SQLクックブック ―データベースエキスパートのための実践レシピ集が今手許になかったもんだから、インターネトた。さんくす。

てふわけで。

ファーストステップ。置換結果を得る SQL だぞ
1   SELECT
2   ID
3   , REPLACE(post_content, '[code language=', '[code lang=') AS post_content
4   FROM wp1_posts
5   WHERE post_content LIKE '%[code language=%'
セカンドステップ。UPDATE 文に仕立て上げるのに必要なサブクエリの具
 1 SELECT
 2 ID, post_content
 3 FROM
 4 (
 5   SELECT
 6   ID
 7   , REPLACE(post_content, '[code language=', '[code lang=') AS post_content
 8   FROM wp1_posts
 9   WHERE post_content LIKE '%[code language=%'
10 ) b
目的の UPDATE。
 1 UPDATE
 2   wp1_posts a,
 3   (
 4     SELECT
 5     ID
 6     , REPLACE(post_content, '[code language=', '[code lang=') AS post_content
 7     FROM wp1_posts
 8     WHERE post_content LIKE '%[code language=%'
 9   ) b
10 
11 SET
12   a.post_content = b.post_content
13 WHERE a.ID = b.ID

なおこのネタ、実は「Pygmentize」からの一連の流れだったりします。つまりね、「プラグインを自力で書き換えて」るわけなんだけど、これまではオリジナルのプラグインのショートコードと同じ仕様にしてて、でもどうせだからと全部「俺様プラグイン仕様」に、記事を全置換したくてな。つまり上の SQL は、WordPress のデータベース相手です。