2011-11-01 16 views
7

Tenemos el siguiente escenario donde foo ha sido renombrado como .Cómo mover datos entre 2 tablas/con columnas diferentes en bases de datos diferentes

foo.col1 ha sido renombrado como foo1.col11.

foo.col2 se ha eliminado

De hecho, estos solían ser tablas similares y me gustaría copiar los datos de A a B para estas tablas. ¿Cómo haría una migración simple dado que los nombres de tabla/columna han sufrido un cambio?

Database 'A' 
create table foo {id pk, col1 varchar(255), col2 tinyint(1), col3 datetime); 
create table foo_bar1 (id pk, foo_id fk, col4 datetime, col5 varchar(255)); 

Database 'B' 
create table foo1 {id pk, col11 varchar(255), col3 datetime); 
create table foo1_bar1 (id pk, foo1_id fk, col4 datetime, col5 varchar(255)); 
+0

INSERTAR EN B.foo (id, col11, col3) SELECCIONAR id, col1, col3 FROM A.foo – dwalldorf

Respuesta

9

usted debe ser capaz de hacer:

INSERT INTO B.foo1 (id, col11, col3) 
SELECT id,col1,col3 FROM A.foo; 

INSERT INTO B.foo1_bar1 (id, foo1_id, col4, col5) 
SELECT id,foo_id,col4,col5 FROM A.foo_bar1; 
+0

¿Hay alguna manera de pasar los nombres de la base de datos como argumentos a la secuencia de comandos sql que se ejecutará en la base de datos 'B' – priya

+0

si mira las sentencias sql anteriores puede ver que el nombre de la base de datos ya está incluido, no necesita para seleccionar una base de datos en su secuencia de comandos sql. p.ej. insertar en . ... funciona incluso si no ha seleccionado "" antes de – Gryphius

+0

No, hay una forma de pasar la base de datos fuente como argumento (por ejemplo, para 'A') – priya

1
BEGIN; 
INSERT INTO B.foo1 (id, col11, col3) 
    SELECT id, col1, col3 
    FROM A.foo; 
INSERT INTO B.foo1_bar1 (id, foo1_id, col4, col5) 
    SELECT id, foo_id, col4, col5 
    FROM A.foo_bar1; 
COMMIT; 
1

si conoce la columnas que se han eliminado se puede hacer una inserción recta de resultados de la consulta:

INSERT INTO B.foo1 (id, col11, col3) (SELECT id, col1, col3 FROM A.foo); 
INSERT INTO B.foo_bar1 (id, foo1_id, col4, col5) (SELECT id, foo_id, col4, col5 FROM A.foo_bar1); 
1

otra solución que incluye su segunda pregunta para establecer dinámicamente el nombre de la base de datos de origen

crear la secuencia de comandos 'bla.sql':

SET @q = CONCAT('INSERT INTO B.foo1 (id, col11, col3) 
    SELECT id,col1,col3 FROM ',@sourcedb,'.foo'); 
PREPARE stmt FROM @q; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

(agregar instrucciones adicionales si fuera necesario)

continuación, ejecuta desde la consola:

mysql -e "SET @sourcedb:='A' ; source bla.sql;" B -u root 

fuente para esta solución: variable database name y koneraks comment ;-)

Cuestiones relacionadas