2013-03-01 51 views
1

我有不同的數據庫列identicle而插入在MySQL

Database : live 
table : customer 
id | name | email | address 

Database : test 
table : customer 
id | name | email | address | phone | post_code | company 

這僅僅是示例結構的兩個相同的表。我在數據庫表中有15個字段,在測試數據庫表中有35個字段。我想寫一個查詢,它可以從實時插入數據到測試數據庫表。我怎樣才能做到這一點。我已經試過這

INSERT INTO test.customer 
SELECT * 
FROM live.customer as cd 
WHERE NOT EXISTS(SELECT * from test.customer); 

此插入錯誤的列中的數據,如果他們不以相同的順序。
而這是其他方式,我已經試過

INSERT INTO test.customer (id,name,email,address) 
SELECT * 
FROM live.customer as cd 
WHERE NOT EXISTS(SELECT * from test.customer); 

這是好的,但我不想寫15個名。如何從實時數據庫表中選擇所有列,並將結果放入()中插入。

回答

2

我不認爲有一個純粹的SQL解決方案。但您可以使用以下方式創建的動態查詢:

SET @sql = null; 

SELECT 
    CONCAT('INSERT INTO test.customer (', 
    group_concat(CONCAT('`', COLUMN_NAME, '`') separator ','), 
    ') SELECT ', 
    group_concat(CONCAT('`', COLUMN_NAME, '`') separator ','), 
    ' FROM live.customer WHERE NOT EXISTS(SELECT * from test.customer)') 
FROM `INFORMATION_SCHEMA`.`COLUMNS` 
WHERE `TABLE_NAME`='customer' AND `TABLE_SCHEMA`='test' 
INTO @sql; 

PREPARE stmt FROM @sql; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

SELECT * FROM test_customer; 

請參閱小提琴here

+0

@raheelshan我稍微更新了我的答案,因爲不能保證使用GROUP_CONCAT列名總是以相同順序返回,所以最好在SELECT部分​​指定列名而不是使用*,並且還添加了一個CONCAT引用列名,希望這有助於:) – fthiella 2013-03-01 10:20:40

+0

感謝您的幫助。我很感激! – 2013-03-01 10:33:43

+0

@raheelshan不客氣! :) – fthiella 2013-03-01 10:38:55