2011-11-01 1 views
7

foo의 이름이 foo1 인 다음과 같은 시나리오가 있습니다.다른 데이터베이스에서 서로 다른 열을 사용하여 두 테이블간에 데이터를 이동하는 방법

foo.col1foo1.col11으로 변경되었습니다. 사실 이러한 유사한 테이블로 사용하고 내가이 테이블 B에 데이터를 복사하고 싶은

foo.col2

를 제거되었습니다. 테이블/컬럼 이름이 변경된 경우 간단한 마이그레이션을 수행하는 방법은 무엇입니까?

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

답변

9

당신이 할 수있을 것입니다 :

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

데이터베이스 이름을 데이터베이스 'B'에서 실행될 sql 스크립트에 전달하는 방법이 있습니까 – priya

+0

위의 sql 문을 보면 데이터베이스 이름이 이미 포함되어 있다는 것을 알 수 있습니다. 필요하지 않습니다. SQL 스크립트에서 데이터베이스를 선택하십시오. 예. 에 삽입하십시오. ... – Gryphius

+0

전에 ""을 선택하지 않은 경우에도 작동합니다. 아니요, 소스 데이터베이스를 인수로 전달할 수있는 방법이 있습니까 (예 : '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

당신은 쿼리 결과를 바로 삽입 할 수있는 제거 된 열을 알고있는 경우 :

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

을 소스 데이터베이스 이름을 동적으로 설정하는 두 번째 질문이 포함 된 또 다른 솔루션

스크립트 '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; 

(필요에 따라 추가 문을 추가합니다)를 콘솔에서 실행

:이 솔루션에 대한

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

소스 : variable database name 및 koneraks comment ;-)

관련 문제