2011-11-01 70 views
7

Chúng tôi có trường hợp sau đây foo đã được đổi tên thành foo1.Cách di chuyển dữ liệu giữa 2 bảng/với các cột khác nhau trong cơ sở dữ liệu khác nhau

foo.col1 đã được đổi tên thành foo1.col11.

foo.col2 đã được gỡ bỏ

Trong thực tế những từng là bảng tương tự và tôi muốn sao chép dữ liệu từ A đến B cho các bảng. Làm thế nào tôi sẽ đi về làm một di cư đơn giản cho rằng các tên bảng/cột đã trải qua một sự thay đổi.

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) CHỌN id, col1, col3 TỪ A.foo – dwalldorf

Trả lời

9

bạn sẽ có thể làm:

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ó cách nào để chuyển tên cơ sở dữ liệu làm đối số cho tập lệnh sql sẽ được thực thi trên cơ sở dữ liệu 'B' – priya

+0

nếu bạn nhìn vào các câu lệnh sql ở trên, bạn có thể thấy tên cơ sở dữ liệu đã được bao gồm, bạn không cần để chọn cơ sở dữ liệu trong tập lệnh sql của bạn. ví dụ. chèn vào . ... hoạt động ngay cả khi bạn chưa chọn "" trước – Gryphius

+0

Không, có cách nào để chuyển cơ sở dữ liệu nguồn làm đối số (ví dụ: '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

NẾU bạn biết các cột đã được gỡ bỏ, bạn có thể làm một chèn thẳng của kết quả truy vấn:

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

giải pháp khác bao gồm câu hỏi thứ 2 của bạn để đặt tên cơ sở dữ liệu nguồn động

tạo kịch bản của bạn '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; 

(thêm báo cáo thêm khi cần thiết)

sau đó chạy từ giao diện điều khiển:

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

nguồn cho giải pháp này: variable database name và koneraks comment ;-)

Các vấn đề liên quan