2011-03-15 28 views
5

Esto funciona en una mesa donde doc_id es la clave principal:MySQL Error de actualización 1093

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

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

Pero cuando estoy usando la misma consulta de selección para establecer un campo en la tabla, se informa del error siguiente:

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 

No entiendo de qué referencia de tabla de destino está hablando. ¿Alguien puede explicar?

Respuesta

10

Esta restricción se documenta en el MySQL manual:

Currently, you cannot update a table and select from the same table in a subquery.

Como solución alternativa, se puede envolver el sub-consulta en otro sub-consulta y evitar que el error:

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

aunque me hace ¿Se supone que esa restricción lo protege de algo que la solución revela o es un problema técnico? – chustar

1

No puede usar una tabla que está actualizando en una subconsulta en la cláusula from. Pruebe una combinación, o una doble subconsulta :)

1

Creo que puede ser porque está leyendo y escribiendo desde la misma tabla. Esta podría ser una forma preventiva de bloquear la escritura porque su actualización podría afectar los datos que se leen.

Puede que necesite separar la subconsulta en el uso de una tabla virtual intermedia.

Cuestiones relacionadas