SELECTクエリで使用するのと同じテーブルを更新(更新)することはできません。

今日、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';







しかし、この方法は非常にく、パフォーマンスに悪影響を及ぼします。 そして、残念ながら、一時テーブルに複数回アクセスすると動作しません...



All Articles