Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

problema en sintaxis de DELETE

Estas en el tema de problema en sintaxis de DELETE en el foro de Mysql en Foros del Web. Hola, el siguiente query me da el error mencionado debajo: delete from atr_varchars where id in (select varchars.id FROM `objetos_atributos` AS objetos, `atr_values_tablas` AS rel_tablas, ...
  #1 (permalink)  
Antiguo 02/03/2011, 11:09
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 15 años, 5 meses
Puntos: 2
problema en sintaxis de DELETE

Hola, el siguiente query me da el error mencionado debajo:

delete from atr_varchars where id in
(select varchars.id
FROM
`objetos_atributos` AS objetos,
`atr_values_tablas` AS rel_tablas,
`atr_varchars` AS varchars
WHERE
objetos.objeto_id = 70 AND
objetos.value_id = rel_tablas.id AND
rel_tablas.tabla = 'atr_varchars' AND
rel_tablas.valor_id = varchars.id )

error: #1093 - You can't specify target table 'obj_atr_varchars' for update in FROM clause

no entiendo porque da error. El select devuelve correctamente un registro con un numero de id. Si reemplazo el select por el id en concreto, el delete funciona, pero dejando el select, el delete no anda. ¿alguien sabe por qué? gracias
  #2 (permalink)  
Antiguo 02/03/2011, 11:20
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: problema en sintaxis de DELETE

Porque no puedes borrar registros en la misma tabla que estás leyendo.
¿Cortarías la rama del árbol en la que estás parado? No, porque te caerías. El caso es el mismo: Si borras al mismo tiempo que los lees, en qué estado está y dónde se encuentra el registro a donde está posicionado el puntero? ¿Existe o no existe?

¿Se entiende?
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/03/2011, 11:59
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: problema en sintaxis de DELETE

Si, se entiende. suena lógico,
pero ¿no es que primero resuelve el select interior y luego ejecuta el delete?
  #4 (permalink)  
Antiguo 02/03/2011, 12:07
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: problema en sintaxis de DELETE

Pero estás hablando de una sola operación, no de dos. El select interior crea una tabla derivada, la cual bloquea la lectura / escritura de todas ellas hasta que la operación completa termine.
Las consultas se deben analizar como un todo, porqkue para el DBMS son un todo. No por pedacitos.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 02/03/2011, 12:20
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: problema en sintaxis de DELETE

Aha,, mm.. es un poco más complejo de lo que pensaba.
Bueno, lo que se me ocurre hacer entonces, es hacer 2 querys distintos. En el primero obtengo la salida del select, y en el segundo elimino los registros que obtuve antes. ¿es correcto?
  #6 (permalink)  
Antiguo 02/03/2011, 12:22
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: problema en sintaxis de DELETE

Hola maue75...

No estoy seguro de cómo es la sintaxis, pero según yo puedes hacer borrados de múltiples tablas más o menos así:

Código MySQL:
Ver original
  1. DELETE atr_varchars
  2. objetos_atributos
  3. INNER JOIN atr_values_tablas
  4. INNER JOIN atr_varchars
  5. objetos_atributos.value_id = atr_values_tablas.id AND
  6. atr_values_tablas.valor_id = atr_varchars.id AND
  7. atr_values_tablas.tabla = 'atr_varchars' AND
  8. objetos_atributos.objeto_id = 70

------

Código MySQL:
Ver original
  1. atr_varchars
  2. objetos_atributos
  3. INNER JOIN atr_values_tablas
  4. INNER JOIN atr_varchars
  5. objetos_atributos.value_id = atr_values_tablas.id AND
  6. atr_values_tablas.valor_id = atr_varchars.id AND
  7. atr_values_tablas.tabla = 'atr_varchars' AND
  8. objetos_atributos.objeto_id = 70

Hace tiempo leí algo acerca de este tipo de delete's, pero no lo he puesto en práctica... hice un pequeño ejemplo con dos tablas y funciona, es cuestión de que hagas la prueba.

Checa el manual de referencia de MySQL, ahí están varios ejemplos de DELETE's utilizando JOINS, creo que alguno se podría adecuar a lo que necesitas.

http://dev.mysql.com/doc/refman/5.0/en/delete.html

Saludos
Leo.
  #7 (permalink)  
Antiguo 02/03/2011, 12:40
 
Fecha de Ingreso: noviembre-2008
Mensajes: 288
Antigüedad: 15 años, 5 meses
Puntos: 2
Respuesta: problema en sintaxis de DELETE

Buenísimo, gracias a ambos!!! gnzsoloyo y leonardo
  #8 (permalink)  
Antiguo 02/03/2011, 16:46
 
Fecha de Ingreso: abril-2008
Mensajes: 93
Antigüedad: 16 años
Puntos: 10
Respuesta: problema en sintaxis de DELETE

Código:
delete from atr_varchars
where id in
(select t.valor_id
FROM
objetos_atributos o,
atr_values_tablas t
WHERE
o.objeto_id = 70 AND
o.value_id = t.id AND
t.tabla = 'atr_varchars')
Esto creo que es equivalente a lo que querías hacer

Etiquetas: delete, sintaxis
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:08.