Ver Mensaje Individual
  #13 (permalink)  
Antiguo 21/08/2008, 12:00
jurena
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 8 meses
Puntos: 300
Respuesta: migrar base de datos

Yo, a pesar de lo que dice mi amigo Seyko (por cierto, estaremos todos encantados de que sigas entrando en este hilo y aportando), no puedo decirte nada sobre las conexiones entre distintas bases, etc. Yo, como te he dicho, me sitúo en el momento en que tienes exportados los datos a una tabla MysQL. Yo la he llamado titulos, y trabajo con la tabla MySQL directamente.

1) Esta consulta de inserción carga en la tabla autores (que he creado previamente con los campos idautor (int, autoincrementable) y autor (varchar)) los distintos autores que aparecen en registros de titulos que tengan un solo autor
INSERT INTO autores (autor) SELECT distinct autores FROM titulos WHERE autores NOT LIKE '%;%';

2) Esto carga en una tabla autortitulo (que he creado antes al efecto) en los campos refidtitulo y refidautor los datos de idtitulo y autores, procedentes de la tabla titulos (la de partida), pero solo aquellos en que hay un único autor:
INSERT INTO autortitulo (refidtitulo, refidautor) SELECT idtitulo, autores FROM titulos WHERE autores NOT LIKE '%;%';

3)
a) SELECT idtitulo, autores FROM titulos WHERE autores LIKE '%;%';
Esto te cargará el idtitulo y los autores separados por punto y coma. Esta consulta te servirá para cargar en el array que dices o para trabajar con ella en el tratamiento de texto.
b) tras trabajar con ellos, sea mediante arrays con PHP que generarán los datos que luego harás que se inserten en la tabla autores, o haciéndolo manualmente en un archivo de texto, importarás: I) desde la tabla de autortítulo, para la que utilizarás los dos datos, y
II) desde la tabla de autores, para la que no necesitarás el idtitulo.

4) Aquí te tocaría eliminar los repetidos (si no lo has hecho ya mediante programación) en la tabla autores, duplicados que puedes localizar con la consulta: SELECT *, count(*) as total FROM autor GROUP BY autor HAVING total > 1; eliminas todos los repetidos menos uno.

Ya tienes los datos. Ahora se trata de establecer las relaciones entre las tablas. Nos falta el número de refidautor en la tabla autortitulo, que ahora es una cadena. Aquí subsiste el peligro de que dos personas se llamen igual, es decir, que tengan los mismos nombre y apellido (ya eres consciente). Te tocaría revisar antes esos nombres...

Añades un campo a la tabla autortitulo llamado idautor, que será numérico, por ej. int(11)
y con esta consulta pones el idautor de autores al campo idautor de autortitulo:
UPDATE autortitulo at, autores a SET at.idautor = a.idautor WHERE a.autor = at.refidautor

5) Ahora, si todo está bien, puedes eliminar los campos refidautor de autor titulo
ALTER TABLE autortitulo DROP COLUMN refidautor

Y autores de la tabla titulos
ALTER TABLE titulos DROP COLUMN autores

6) creo en la tabla autores dos campos de texto, nombre y apellidos,
ALTER TABLE `autores` ADD `nombre` VARCHAR( 50 ) NOT NULL AFTER `autor` ,
ADD `apellidos` VARCHAR( 100 ) NOT NULL AFTER `nombre` ;

y luego pongo nombres y apellidos
mediante las sintaxis
UPDATE autores SET nombre = TRIM(LEFT(autor, LOCATE(',', autor)-1)), apellidos = TRIM(SUBSTRING(autor, LOCATE(',', autor)+1))

7) borro el campo autor de la tabla autores
ALTER TABLE autor DROP COLUMN autores



8) ahora puedo añadir los índices correspondientes a los PK (si no lo he hecho antes), es decir a los campos idautor y refidtitulo de la tabla autortitulo, y luego hacer un repair de las tablas y empezar a trabajar con inner join... etc.

Lo he ido probando y a mí me ha funcionado, aunque debes ir con mucho cuidado y revisando todo. Haz si quieres alguna prueba antes con pocos registros...

Tal vez no te sirva de nada, pero tal vez también te ofrezca alguna idea.

Última edición por jurena; 24/08/2008 a las 11:19