2011-11-07 84 views
0

比方說,我有類似結構的兩個表,但一個是空的,其他有信息的幾行:MySQL的 - 表中的數據複製到不相同的表

table1的

col1 | col2 | col3 
red | cow | 1 
blue | dog | 2 
gray | pig | 3 

表2

col1 | col2 | col3 | col4 

表3

col1 | col2 

嘗試:

insert into `table2` select * from `table1` 

不會因爲不匹配的列數的工作,這同樣適用於表2代真表3。

更改SELECT語句的*部分不是用於動態目的的選項。所以一個解決方法必須是一個組合信息的修改後的SELECT。

是否有JOIN語句或一些會合並表的結構和數據,所以它看起來是這樣的:

select * from `table1`,`table2` (JOIN or some other statement) 
col1 | col2 | col3 | col4 
red | cow | 1 | NULL 
blue | dog | 2 | NULL 
gray | pig | 3 | NULL 

select * from `table1`,`table3` (JOIN or some other statement) 
col1 | col2 
red | cow 
blue | dog 
gray | pig 

基本上只是合併的列具有相同的名稱和抵消外配。同樣,它不能引用特定的列名來保持動態。這似乎是可行的,但我發現找不到答案是不可能的。

非常感謝任何人的幫助。

回答

1

如果INSERT的目標表就像是在你的榜樣源表的一個子集,然後有一個簡單的解決方案:

insert into table2(col1, col2, col3) 
select * 
from table1; 

或者,如果兩個表的第一列是相同的爲了像你的榜樣,那麼您將發佈查詢應實際工作:

insert into table2 select * from table1; 

我引用manual for version 5.6上:

如果您沒有以嚴格SQL模式運行,那麼給定值的任何列都不會顯式地 設置爲其默認(顯式或隱式)值。例如,對於 示例,如果您指定的列名稱未列出表中所有 列,則未命名的列將設置爲其默認值。 默認值分配在第10.1.4節「數據類型 默認值」中介紹。另見第1.8.6.2節「無效的 數據上的限制」。

然而,幾乎總是一個壞主意,取決於「SELECT *」在INSERT操作。所以,儘管你的要求,它真的應該是:

insert into table2(col1, col2, col3) 
select col1, col2, col3 
from table1; 

想任何事情越多,你將不得不使用DESCRIBE tablex和動態建立查詢。

+0

他也可以使用:'insert into table2 select table1。*,NULL from table1' –

+0

但我絕對同意你對**總是使用**的評論。 –

+0

DESCRIBE是我的最後一招,但這些答案使它看起來像是我唯一的選擇。感謝您的查詢,但我認爲我要求的語法比這些更復雜。 – user1032911

0

您可以允許將最終排除的列的空值。

insert into `table2` (col1, col2, col3) select col1, col2, col3 from `table1` 

也可能對您有用。

相關問題