2011-11-01 21 views
7

Mamy następujący scenariusz, w którym foo zmieniono nazwę na foo1.Jak przenosić dane między 2 tabelami/różnymi kolumnami w różnych bazach danych

foo.col1 został przemianowany na foo1.col11.

foo.col2 została usunięta

W rzeczywistości te kiedyś podobne tabele i chciałbym do kopiowania danych z punktu A do punktu B do tych tabel. Jak mam przeprowadzić prostą migrację, biorąc pod uwagę, że nazwy tabel/kolumn uległy zmianie.

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

INSERT INTO B.foo (id, col11, col3) SELECT id, col1, col3 FROM A.foo – dwalldorf

Odpowiedz

9

powinieneś być w stanie to zrobić:

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

Czy istnieje sposób przekazywania nazw bazy danych jako argumentów do skryptu sql, które będą wykonywane w bazie danych 'B' – priya

+0

jeśli spojrzysz na instrukcje SQL powyżej, możesz zauważyć, że nazwa bazy danych jest już zawarta, nie potrzebujesz aby wybrać bazę danych w skrypcie sql. na przykład. wstaw do . ... działa nawet, jeśli nie wybrałeś "" przed – Gryphius

+0

Nie, czy istnieje sposób przekazania źródłowej bazy danych jako argumentu (np. Dla '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

jeśli znasz kolumn, które zostały usunięte można zrobić prostą wkładkę wyników zapytania:

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

inne rozwiązanie, które obejmuje Twoje drugie pytanie, aby dynamicznie ustawić nazwę źródłowej bazy danych

tworzenia skryptu '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; 

(dodawania dodatkowych oświadczeń w razie potrzeby)

następnie uruchomić z konsoli:

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

źródłowego dla tego rozwiązania: variable database name i komentarz koneraków ;-)

Powiązane problemy