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';

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

Source: https://habr.com/ru/post/J49531/


All Articles