2010-07-14 18 views
5

espero que no estoy siendo demasiado tiempo sin aliento en esta pregunta, sólo quiero para asegurarse de que lo que estoy pidiendo es completamente claro (creo que es bastante confuso :).copia de tabla relacional de datos

Tengo una base de datos con un montón de mesas con todas mis claves foráneas establecidas. Las relaciones a veces tienen varias tablas de profundidad, y también hay casos en los que un niño está relacionado con más de una tabla principal. Quiero insertar una copia de una de las filas de mi tabla de "nivel superior" y todos los datos de la tabla hija que se relacionan con ella (manteniendo la integridad relacional). Es decir, mi nueva fila de nivel superior obtiene su propia clave principal nueva (a través de auto_increment) y todas las nuevas filas secundarias obtienen sus propias claves primarias (de nuevo a través de auto_increment) y toda la información de clave externa de las tablas se relaciona análogamente con la datos que copié (solo ahora con las claves primarias recién creadas). Así que ahora tendría una copia de los datos relacionales que se podían modificar independientemente del original.

para hacer mi ejemplo más concreto, yo he puesto con esmero hasta un ejemplo análogo, pero más simple. Permite definir las siguientes tablas:

alt text http://www.freeimagehosting.net/uploads/ef22070a89.png

Todos los campos id verdes son las claves principales AUTO_UPDATE, y los amarillentos son columnas con restricciones de clave externa indexados. Digamos que la base de datos tiene los siguientes datos en el mismo principio:

job_types 
+----+----------+ 
| id | jobcode | 
+----+----------+ 
| 1 | DEADBEEF | 
| 3 | FEEDFACE | 
+----+----------+ 

managers 
+----+---------------+-------------+ 
| id | name   | job_type_id | 
+----+---------------+-------------+ 
| 1 | John   |   1 | 
| 3 | Michael Scott |   3 | 
+----+---------------+-------------+ 

departments 
+----+------+------------+ 
| id | name | manager_id | 
+----+------+------------+ 
| 1 | H32 |   1 | 
| 2 | X11 |   3 | 
+----+------+------------+ 

employees 
+----+-------------+---------------+------------+-------------+ 
| id | name  | department_id | manager_id | job_type_id | 
+----+-------------+---------------+------------+-------------+ 
| 1 | Billy Bob |    1 |   1 |   1 | 
| 2 | Sandra Lee |    1 |   1 |   3 | 
| 3 | Buddy Holly |    2 |   3 |   1 | 
+----+-------------+---------------+------------+-------------+ 

Ahora dicen lo que quiero hacer es hacer una copia relacional del departamento de H32 (id = 1).

Lo que debería terminar con algo así como lo siguiente (los valores reales, obviamente, de las claves primarias no es importante, es la integridad referencial).

job_types 
+----+----------+ 
| id | jobcode | 
+----+----------+ 
| 1 | DEADBEEF | 
| 3 | FEEDFACE | 
| 4 | DEADBEEF | 
| 5 | FEEDFACE | 
+----+----------+ 

managers 
+----+---------------+-------------+ 
| id | name   | job_type_id | 
+----+---------------+-------------+ 
| 1 | John   |   1 | 
| 3 | Michael Scott |   3 | 
| 4 | John   |   4 | 
+----+---------------+-------------+ 

departments 
+----+------+------------+ 
| id | name | manager_id | 
+----+------+------------+ 
| 1 | H32 |   1 | 
| 2 | X11 |   3 | 
| 3 | H32 |   4 | 
+----+------+------------+ 

employees 
+----+-------------+---------------+------------+-------------+ 
| id | name  | department_id | manager_id | job_type_id | 
+----+-------------+---------------+------------+-------------+ 
| 1 | Billy Bob |    1 |   1 |   1 | 
| 2 | Sandra Lee |    1 |   1 |   3 | 
| 3 | Buddy Holly |    2 |   3 |   1 | 
| 4 | Billy Bob |    3 |   4 |   4 | 
| 5 | Sandra Lee |    3 |   4 |   5 | 
+----+-------------+---------------+------------+-------------+ 

¿Cuál es la forma más eficaz de implementar este tipo de operación de copia? Por lo que vale, estoy trabajando con MySQL, usando el motor de tabla InnoDB, en el contexto de Grails. Espero escuchar algunas buenas ideas sobre cómo hacer algo así "de la manera correcta".

- Saludos, Vic

que he publicado en Pastebin a MySQLDump of the example inicialización.

EDITAR Por si sirve de algo, yo publicado un/cuestión más amplia mucho más simple here y me dieron respuestas positivas en general, lo que sugiere que no soy "simplemente haciendo mal" ...

+0

Si me permite la pregunta, ¿cuál es tu motivación para hacer copias por todo el gráfico de mesa? Tu pregunta es hacer que las alarmas de anomalías de datos se apaguen en mi cabeza. – proflux

+0

@proflux, de acuerdo, casi parece que los datos están siendo desnormalizados haciendo una copia profunda –

+0

Alarmas aquí también. – eillarra

Respuesta

1

tengo hecho algo similar usando la sintaxis INSERT INTO ... SELECT. (La API C también tiene un MYSQL_OPTION_MULTI_STATEMENTS_ON que puede usar para ejecutar múltiples instrucciones con. O puede usar un procedimiento).

Este es el más eficaz, ya que no tiene que mover datos entre el cliente y el servidor. El valor copiado era una plantilla para crear una nueva entidad. No entiendo por qué estás haciendo esto con este modelo de datos en particular.

Cuestiones relacionadas