2011-08-16 11 views
5

Tengo 4 tablas. En la primera tabla tiene appid como clave principal y en otras tres tabla su clave externa. Quiero eliminar datos de todas las tres en una consulta. Intenté lo mejor pero fallé. ¿Alguien puede ayudar?¿Eliminar registros de varias tablas simultáneamente?

+0

Este es el problema que se inventó para resolver la acción referencial 'ON DELETE CASCADE'. A diferencia de @Tony Andrews, lo recomiendo como práctica general. – onedaywhen

Respuesta

10

No se puede escribir una instrucción de eliminación que hace referencia a más de una tabla, tiene que escribir 4 delete.

Sin embargo, en su caso, se pueden definir las claves externas de las 3 tablas secundarias en "ON DELETE CASCADE". Luego, cuando elimina de la tabla padre, también se eliminan todas las filas asociadas de las 3 tablas secundarias. Esto puede ser útil a veces, pero no lo recomendaría como práctica general, ya que puede ser peligroso y confuso para los desarrolladores.

+0

¿Puede explicar la naturaleza peligrosa y confusa de las claves externas en cascada? Porque estoy un poco sorprendido por esta observación. – Rene

+2

@Rene, OK, en este momento, actualmente trabajo en un proyecto en el que alguien ha configurado muchas claves externas como ON DELETE CASCADE. Entonces, por ejemplo, si un usuario hace algo como 'DELETE order_status_lookup DONDE status_code = 'SHIPPED'' entonces tiene éxito y todos los pedidos con el estado' ENVIADO 'también se eliminan. Yo llamo a eso un, pero peligroso! De hecho, uso ON DELETE CASCADE, pero solo donde realmente tiene sentido. –

+0

Entonces, lo que está diciendo es que es una herramienta que puede ser muy útil, pero que si se usa de manera incorrecta puede causar daños. Un poco como una motosierra ¿no? ¿Pero recomendaría entonces talar todos esos árboles manualmente? – Rene

3

No hay manera de eliminar de muchas mesas con una sola instrucción, pero la mejor pregunta es ¿Por qué necesita eliminar de todas las tablas al mismo tiempo? Me parece que no comprende completamente cómo funcionan las transacciones en Oracle.

digamos que usted login y eliminar una fila de la tabla 1, pero no se comprometen. En lo que respecta a todas las demás sesiones, esa fila no se ha eliminado. Si abre otra conexión y consulta para la fila, aún estará allí.

Luego se eliminan de las tablas 2, 3 y 4, a su vez. Aún no has comprometido la transacción, por lo que todas las otras sesiones en la base de datos aún pueden ver las filas eliminadas.

Luego te comprometes.

Todos al mismo tiempo, las otras sesiones ya no podrán ver las filas que elimina de la 4 mesas, a pesar de que hizo las eliminaciones en 4 estados separados.

+4

Creo que estás siendo un poco duro. Puedo ver el mérito en una sintaxis de 'BORRAR TODO' análoga a 'INSERTAR TODO': sería conveniente borrar todos los registros relacionados en un conjunto de tablas sin tener que preocuparse por las dependencias y sin utilizar restricciones diferidas. (Aunque admito que mi necesidad de esto suele ser para administrar datos de prueba en lugar de entornos de producción). – APC

+0

+1 Para una respuesta clara y al punto. – Rene

-2

Si la base de datos es Mysql puede usar join en la declaración DELETE. Ver http://dev.mysql.com/doc/refman/5.0/en/delete.html para obtener más información.

+4

Pero no lo es. Es Oracle. –

+0

Además de otro comentario (transacción o uso de la cascada de eliminación), puede usar el desencadenador para eliminar de las tablas secundarias. –

Cuestiones relacionadas