今日、MySQLの非常に厄介なバグに出会いました。 MySQL 5.0.45で次のクエリを実行する場合:
UPDATE `files` SET `file_md5` =
(
SELECT MD5( `file_blob` )
FROM `files`
WHERE `id`= 6
)
WHERE `id` = 6
エラーが発生しました:
#1093-FROM句で更新するターゲットテーブル 'files'を指定できない判明したように、ケースは
バグ番号6980です。 MySQLでは、SELECTクエリで使用するのと同じテーブルを変更(DELETEを含む)することはできません。 この動作は
dev.mysql.com/doc/mysql/en/UPDATE.htmlで文書化されてい
ます 。 このバグはMySQL 4.1.7で発見されましたが、今日まで修正されていません。
1つの方法は、
複数のクエリを
使用することです 。
または
、サブクエリで一時テーブルを使用でき
ます :
UPDATE `apples`
SET `price` = (
SELECT `price` FROM (
SELECT * FROM `apples`
) AS x
WHERE `variety` = 'gala')
WHERE `variety` = 'fuji';
しかし、この方法は非常にく、パフォーマンスに悪影響を及ぼします。 そして、残念ながら、一時テーブルに複数回アクセスすると動作しません...