Bienvenido(a), Visitante. Favor de ingresar o registrarse.

Ingresar con nombre de usuario, contraseña y duración de la sesión

Foros del Club

Páginas: [1]   Ir Abajo
  Enviar tema  |  Imprimir  
Autor Tema: Ayuda con DELETE en 2 tablas segun condicion  (Leído 1152 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Daniel
Technocrat
*********

Prestigio: 7
Desconectado Desconectado

Sexo: Masculino
Estudiante de: Ingeniería Informática
Profesión: Desarrollador Web 2.0 - Administrador de Redes
Mensajes: 110


WWW
« en: 30/03/2006, 17:22:12 »

Hola gente, me he aquí intentando fallidamente armar una consulta de borrado para registros que residen en 2 tablas diferentes.

Presento la estructura con algunos datos de ejemplo:

Código:
Tabla: session_ids

      id         |      time
    0001                1000
    0002                 500

Tabla: session_vars

     id          |     name        |        value
    0001                xxx                  xxx
    0001                yyy                  yyy
    0001                zzz                  zzz
    0002                aaa                  aaa


Mi intención es que la consulta me elimine de ambas tablas aquellos registros cuyo campo "time" sea igual a 1000. Entonces en este caso me debería borrar de las tablas session_ids y session_vars todos los registros cuyo id sea 0001.

Armé varios intentos que no expongo debido a que no creo que sean de deamasiada utilidad ya que los errores de sintaxis que me arrojaba MySQL eran espantosos -____-
Por si sirve de algo mi versión de MySQL es 4.0.12 (osea sin consultas anidadas si no me equivoco) y lamentablemente no hay posibilidades de migrar a la 5.xxx.

Se agradece de antemano cualquier ayuda.

Les dejo saludos.
En línea

CID
Administrador
Legend
*****

Prestigio: 22
Desconectado Desconectado

Sexo: Masculino
Estudiante de: Arte de la informática
Título universitario: Programador
Profesión: Desarrollador
Mensajes: 1136



WWW
Lenguajes:
Varios
Bases de datos:
Varios
« Respuesta #1 en: 30/03/2006, 18:05:45 »

Lo que queres hacer no lo hace ninguna consulta DML, solución DDL de integridad referencial.

Supuestamente tenes creadas las dos tablas y definidos sus Primary Keys.
La tabla session_ids es la tabla maestra, y la tabla session_vars es la tabla detalle (te das cuenta por el tipo de relación, en este caso es de 1 a N).

Asi que solo tenes que hacer lo siguiente:

Código
/*Pasamos las tablas a tipo INNODB, sino no funciona*/
ALTER TABLE session_ids TYPE=INNODB
ALTER TABLE session_vars TYPE=INNODB

Luego creamos la restricción de clave ajena (o foreign key... en pocas palabras la integridad referencial para estas dos tablas).

Código
ALTER TABLE session_vars /*Vamos a alterar la definicion de esta tabla*/
ADD FOREIGN KEY(id) REFERENCES session_ids(id) /*Vinculamos los indices de las dos tablas*/
ON UPDATE CASCADE
ON DELETE CASCADE
/*Al modificar o eliminar el id (por lo tanto la tupla) de session_ids
se actua en consecuencia sobre la tabla session_vars
es decir, si se modifica el session_ids.id = 400 a 401 la modificación
se propaga a todas las tuplas que tengan session_vars.id = 400
modificandolas a 401. Con la eliminacion sucede lo mismo*/

 

Y por ultimo realizas la eliminación de las tuplas de session_ids con time mayor o igual a 1000

Código
DELETE FROM session_ids
WHERE TIME >= 1000

Con tu ejemplo, y algunos datos más:

Código:
Tabla: session_ids
      id         |      time
    0001                1000
    0002                 500
    0003                1500

Tabla: session_vars
     id          |     name        |        value
    0001                xxx                  xxx
    0001                yyy                  yyy
    0001                zzz                  zzz
    0002                aaa                  aaa
    0003                bbb                  bbb
    0003                ccc                  ccc

El motor primero busca los id en session_vars que correspondan a los id con time >= 1000 de session_ids, y los borra, posteriormente borra los id con time >= 1000 de session_ids. Todo automáticamente... no es maravilloso??

El motor internamente hace algo como ésto:

Código
DELETE FROM session_vars
WHERE id = (
 SELECT ID
 FROM session_ids Ids LEFT JOIN session_vars Vars
 WHERE (TIME >= 1000) AND (Vars.id = Ids.id) )
 
DELETE FROM session_ids
WHERE TIME >= 1000
 
Esto ultimo es solo para dar una idea mental, no está probado.

Tu conjunto resultado:

Código:
Tabla: session_ids
      id         |      time
    0002                 500

Tabla: session_vars
     id          |     name        |        value
    0002                aaa                  aaa

Espero haber sido claro.
« Última modificación: 30/03/2006, 18:11:14 por CID » En línea

Daniel
Technocrat
*********

Prestigio: 7
Desconectado Desconectado

Sexo: Masculino
Estudiante de: Ingeniería Informática
Profesión: Desarrollador Web 2.0 - Administrador de Redes
Mensajes: 110


WWW
« Respuesta #2 en: 30/03/2006, 18:24:56 »

Genial, maravilloso, sin palabras... de lo mejor
Me falta probarlo pero con seguridad todo va a andar OK, despues paso a comentar los resultados.
Se agradece, cuando tenga las clases manejadoras de sesiones van a ir los créditos correspondientes.

Saludos!
En línea

Foros del Club
   

 En línea
Páginas: [1]   Ir Arriba
  Enviar tema  |  Imprimir  
 
Ir a: