Saltar al contenido

MySQL Error 1093: no se puede especificar la tabla de destino para la actualización en la cláusula FROM

Después de investigar en diversos repositorios y sitios de internet finalmente hemos dado con la respuesta que te mostraremos pronto.

Solución:

Actualización: esta respuesta cubre la clasificación general de errores. Para obtener una respuesta más específica sobre cómo manejar mejor la consulta exacta del OP, consulte otras respuestas a esta pregunta

En MySQL, no puede modificar la misma tabla que usa en la parte SELECT.
Este comportamiento está documentado en: http://dev.mysql.com/doc/refman/5.6/en/update.html

Tal vez puedas simplemente unir la mesa a sí misma.

Si la lógica es lo suficientemente simple como para remodelar la consulta, pierda la subconsulta y una la tabla a sí misma, empleando los criterios de selección apropiados. Esto hará que MySQL vea la tabla como dos cosas diferentes, lo que permitirá que se lleven a cabo cambios destructivos.

UPDATE tbl AS a
INNER JOIN tbl AS b ON ....
SET a.col = b.col

Alternativamente, intente anidar la subconsulta más profundamente en una cláusula from …

Si necesita absolutamente la subconsulta, hay una solución, pero es desagradable por varias razones, incluido el rendimiento:

UPDATE tbl SET col = (
  SELECT ... FROM (SELECT.... FROM) AS x);

La subconsulta anidada en la cláusula FROM crea un tabla temporal implícitapor lo que no cuenta como la misma tabla que está actualizando.

… pero cuidado con el optimizador de consultas

Sin embargo, tenga en cuenta que a partir de MySQL 5.7.6 y posteriores, el optimizador puede optimizar la subconsulta y aún así generar el error. Por suerte, el optimizer_switch variable se puede utilizar para desactivar este comportamiento; aunque no podría recomendar hacer esto como algo más que una solución a corto plazo, o para pequeñas tareas únicas.

SET optimizer_switch = 'derived_merge=off';

Gracias a Peter V. Mørch por este consejo en los comentarios.

La técnica de ejemplo fue de Baron Schwartz, publicada originalmente en Nabble, parafraseada y extendida aquí.

NexusRex proporcionó una muy buena solución para eliminar con combinación de la misma tabla.

Si haces esto:

DELETE FROM story_category
WHERE category_id NOT IN (
        SELECT DISTINCT category.id AS cid FROM category 
        INNER JOIN story_category ON category_id=category.id
)

vas a recibir un error.

Pero si envuelve la condición en una selección más:

DELETE FROM story_category
WHERE category_id NOT IN (
    SELECT cid FROM (
        SELECT DISTINCT category.id AS cid FROM category 
        INNER JOIN story_category ON category_id=category.id
    ) AS c
)

haría lo correcto!!

Explicación: El optimizador de consultas hace un optimización de fusión derivada para la primera consulta (lo que hace que falle con el error), pero la segunda consulta no califica para el optimización de fusión derivada. Por lo tanto, el optimizador se ve obligado a ejecutar primero la subconsulta.

Él inner join en su subconsulta es innecesario. Parece que desea eliminar las entradas en story_category donde el category_id no está en el category mesa.

Hacer esto:

DELETE FROM story_category 
WHERE category_id NOT IN (
    SELECT DISTINCT category.id 
    FROM category);

En vez de eso:

DELETE FROM story_category 
WHERE category_id NOT IN (
    SELECT DISTINCT category.id 
    FROM category INNER JOIN
         story_category ON category_id=category.id);

Puntuaciones y reseñas

Si estás contento con lo expuesto, eres capaz de dejar una división acerca de qué le añadirías a esta sección.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *