Ошибка обновления MySQL 1093 - PullRequest
5 голосов
/ 15 марта 2011

Это работает в таблице, где doc_id является первичным ключом:

select count(*)+1 from doctor where 
exp > (select exp from doctor where doc_id='001');

+------------+
| count(*)+1 |
+------------+
|          2 |
+------------+

Но когда я использую тот же запрос выбора, чтобы установить поле в таблице, он сообщает об ошибке:

update doctor set rank=
(  select count(*)+1 from doctor where 
   exp > (select exp from doctor where doc_id='001')
) where doc_id='001';

ERROR 1093 (HY000): You can't specify target table 'doctor' for update 
in FROM clause

Я не могу понять, о какой целевой таблице идет речь. Может кто-нибудь объяснить?

Ответы [ 3 ]

10 голосов
/ 15 марта 2011

Это ограничение задокументировано в руководстве по MySQL :

В настоящее время вы не можете обновить таблицу и выбрать одну и ту же таблицу в подзапросе.

В качестве обходного пути вы можете заключить подзапрос в другой подзапрос и избежать этой ошибки:

update doctor set rank=
(select rank from (  select count(*)+1 as rank from doctor where 
   exp > (select exp from doctor where doc_id='001')
) as sub_query) where doc_id='001';
1 голос
/ 15 марта 2011

Я думаю, это может быть потому, что вы читаете и пишете из одной и той же таблицы.Это может быть превентивным способом блокировки записи, потому что ваше обновление может повлиять на читаемые данные.

Возможно, вам потребуется разделить подзапрос на использование промежуточной виртуальной таблицы.

1 голос
/ 15 марта 2011

Вы не можете использовать таблицу, которую вы обновляете, в подзапросе в предложении from. Попробуйте объединение или двойной подзапрос:)

...