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

eliminar registro que tiene clave foranea

Estas en el tema de eliminar registro que tiene clave foranea en el foro de Mysql en Foros del Web. hola todo bien , tengo una registro que esta en una tabla , bien la idea es eliminarlo , pero no puedo ya que este ...
  #1 (permalink)  
Antiguo 10/07/2012, 16:02
 
Fecha de Ingreso: junio-2010
Mensajes: 752
Antigüedad: 14 años, 5 meses
Puntos: 5
eliminar registro que tiene clave foranea

hola todo bien , tengo una registro que esta en una tabla ,
bien la idea es eliminarlo , pero no puedo ya que este es clave foranea de otra tabla, (en este caso de una entidad debil.)

lo que hay que hacer es primero eliminar de la tabla que esta mas "lejos" (entidad debil) despues ahi eliminar el registro en la otra tabla...

me confunde el tema de que con un solo select. actue sobre 2 registro de tablas diferentes....

el tema es masomenos asi...



la consulta a realizar es : "Eliminar todas las facturas del cliente de nombre: 'pablo lopez'"



la tabla ENTIDAD (codigo,nombre)
---------------------------------------------------------

la tabla CLIENTE(codigo_cliente,telefono)

-buscando en entidad 'pablo lopez', me sale el codigo,este corresponde a CLIENTE.codigo_cliente-

---------------------------------------------------------

la tabla FACTURA (NUMERO,fecha,cod_cliente)

---------------------------------------------------------

la tabla LINEA (nro_factura, nro_linea, cantidad, precio , juguete)


.....
en la tabla tiene la clave foranea de FACTURA, 'NUMERO'
intente hacerlo con subconsulta, pero nada tira error.
con un select intente, y me muestra las lineas que correspondes a las facturas del cliente 'pablo lopez', pero no me deja eliminar...
  #2 (permalink)  
Antiguo 10/07/2012, 17:13
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: eliminar registro que tiene clave foranea

Partiendo de que lo que tienes que eliminar son las FACTURAS y no al CLIENTE, no se ve mucha dificultad.
Puedes usar un DELETE con JOIN entre ambas tablas, o bien (mejor aún), definir las FK con la cláusula ON DELETE CASCADE. Cualquiera de las opciones funcionará.
Cita:
me confunde el tema de que con un solo select. actue sobre 2 registro de tablas diferentes....
No se entiende a qué te refieres.
Cita:
intente hacerlo con subconsulta, pero nada tira error.
Por supuesto. No puedes leer y borrar una tabla en MySQL al mismo tiempo. Es como cortar la rama donde estás parado.
Cita:
con un select intente, y me muestra las lineas que correspondes a las facturas del cliente 'pablo lopez', pero no me deja eliminar...
No se entiende qué tiene que ver usar un SELECT con usar DELETE.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 10/07/2012 a las 18:31
  #3 (permalink)  
Antiguo 11/07/2012, 12:15
 
Fecha de Ingreso: junio-2010
Mensajes: 752
Antigüedad: 14 años, 5 meses
Puntos: 5
Respuesta: eliminar registro que tiene clave foranea

hola mira hice eso del join pero no me anda,...




delete
from (SELECT *
FROM factura AS f
JOIN linea AS l ON f.numero = l.nro_factura)
where cod_cliente=
(
select DISTINCT cod_cliente
from factura join entidad as e
on factura.cod_cliente=e.codigo
AND e.nombre like '%Pablo Lopez%'
)
)



dice estoo

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(SELECT * FROM factura AS f JOIN linea AS l ON f.numero = l.nro_factura) wher' at line 2



QUE ERROR PUEDE HABER, ??? ES NECESARIO , CREAR UNA VISTA,,?'
  #4 (permalink)  
Antiguo 11/07/2012, 12:53
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: eliminar registro que tiene clave foranea

Hola vani18:

Creo que deberías comenzar por estudiar la sintaxis del DELETE, pues por lo que veo no tienes idea de cómo trabaja.

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

en primer lugar, en tu sentencia DELETE no estás especificando qué es lo que quieres eliminar, es decir, qué tabla o tablas quieres afectar...

Segundo, tal como especifica gnzsoloyo, no puedes eliminar una tabla y al mismo tiempo utilizarla en una subconsulta,

Cita:
Es como cortar la rama donde estás parado.
Observa este scrpit:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaA;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | uno         |
  6. |    2 | dos         |
  7. |    3 | tres        |
  8. |    4 | cuatro      |
  9. +------+-------------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM tablaB;
  13. +------+-------------+
  14. | id   | descripcion |
  15. +------+-------------+
  16. |    2 | two         |
  17. |    3 | three       |
  18. |    5 | five        |
  19. +------+-------------+
  20. 3 rows in set (0.00 sec)

Supongamos que queremos eliminar de ambas tablas los registros comunes, estos registros los obtenemos con la siguiente consulta,
Código MySQL:
Ver original
  1. mysql> SELECT * FROM tablaA
  2.     -> INNER JOIN tablaB ON tablaA.id = tablaB.id;
  3. +------+-------------+------+-------------+
  4. | id   | descripcion | id   | descripcion |
  5. +------+-------------+------+-------------+
  6. |    2 | dos         |    2 | two         |
  7. |    3 | tres        |    3 | three       |
  8. +------+-------------+------+-------------+
  9. 2 rows in set (0.00 sec)

Es decir, los registros 2 y 3 de la tablaA y los registros 2 y 3 de la tablaB, esta eliminación múltiple la podrías hacer así:

Código MySQL:
Ver original
  1. mysql> DELETE tablaA.*, tablaB.*
  2.     -> FROM tablaA, TablaB WHERE tablaA.id = tablaB.id;
  3. Query OK, 4 rows affected (0.06 sec)
  4.  
  5. mysql> SELECT * FROM tablaA;
  6. +------+-------------+
  7. | id   | descripcion |
  8. +------+-------------+
  9. |    1 | uno         |
  10. |    4 | cuatro      |
  11. +------+-------------+
  12. 2 rows in set (0.00 sec)
  13.  
  14. mysql> SELECT * FROM tablaB;
  15. +------+-------------+
  16. | id   | descripcion |
  17. +------+-------------+
  18. |    5 | five        |
  19. +------+-------------+
  20. 1 row in set (0.00 sec)

Observa que en DELETE NO PUEDES UTILIZAR JOIN'S, por lo que tienes que listar las tablas separadas por comas y poner el las uniones en el WHERE.

Saludos
Leo.

Etiquetas: clave, registro, select, tabla, foreignkey
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 14:16.