Как стать автором
Обновить

Не возможно обновить (UPDATE) ту же таблицу, которую используешь в SELECT-запросе

Время на прочтение1 мин
Количество просмотров865
Сегодня наткнулся на очень неприятный баг в MySQL. При выполнении следующего запроса в MySQL 5.0.45:

UPDATE `files` SET `file_md5` =
(
SELECT MD5( `file_blob` )
FROM `files`
WHERE `id`= 6
)
WHERE `id` = 6

Получил ошибку:
#1093 — You can't specify target table 'files' for update in FROM clause

Как выяснилось дело в баге номер 6980. В MySQL вы не можете изменять (в том числе и DELETE) ту же таблицу, которую используете в SELECT-запросе. Такое поведение задокументировано по адресу dev.mysql.com/doc/mysql/en/UPDATE.html. Баг был обнаружен еще в MySQL 4.1.7, но по сей день не исправлен.

Один из выходов — использовать несколько запросов.

Либо можно использовать временную таблицу во вложенном запросе:

UPDATE `apples`
SET `price` = (
SELECT `price` FROM (
SELECT * FROM `apples`
) AS x
WHERE `variety` = 'gala')
WHERE `variety` = 'fuji';

Но данный метод очень некрасив и плохо сказывается на производительности. И, к сожалению, не будет работать если вы будете обращаться ко временной таблице больше одного раза…
Теги:
Хабы:
Всего голосов 35: ↑6 и ↓29-23
Комментарии12

Публикации

Истории

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
26 октября
ProIT Network Fest
Санкт-Петербург
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань