2011-11-01 10 views
7

Abbiamo il seguente scenario in cui foo è stato rinominato come foo1.Come spostare i dati tra 2 tabelle/con colonne diverse in diversi database

foo.col1 è stato rinominato come foo1.col11.

foo.col2 è stato rimosso

Infatti questi usato per essere tabelle analoghe e desidero copiare i dati da A a B per queste tabelle. Come farei per fare una semplice migrazione dato che i nomi di tabelle/colonne hanno subito una modifica.

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

INSERISCI IN B.foo (id, col11, col3) SELEZIONA id, col1, col3 DA A.foo – dwalldorf

risposta

9

si dovrebbe essere in grado di fare:

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

C'è un modo per passare i nomi del database come argomenti allo script sql che verrà eseguito sul database 'B' – priya

+0

se si guardano le istruzioni sql sopra si può vedere che il nome del database è già incluso, non è necessario per selezionare un database nello script sql. per esempio. inserire in . ... funziona anche se non è stato selezionato "" prima di – Gryphius

+0

No, esiste un modo per passare il database di origine come argomento (ad esempio per "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

se si conoscono le colonne che sono state rimosse si può fare un inserto rettilineo dei risultati delle query:

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

un'altra soluzione che include la seconda domanda per impostare dinamicamente il nome del database di origine

creare lo script '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; 

(aggiungere istruzioni aggiuntive se necessario)

poi eseguito dalla console:

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

fonte per questa soluzione: variable database name e koneraks comment ;-)

Problemi correlati