2010-05-11 35 views
0

我有一個表(id)(自動編號)字段和其他50個字段。該表是標準化的,這些都是50個的材料特性等有什麼方法可以簡化詳細的SQL INSERT INTO(..)查詢嗎?

我想記錄從這個表複製到同一個表 - 只有自動增量ID會有所不同。 我使用的查詢現在是

INSERT INTO tableName (field1,field2,....field50) 
SELECT field1,field2,....field50 from tableName 
WHERE autoid=1234; 

注意,我必須鍵入所有50個字段名,兩次!有什麼方法可以縮短這個查詢,所以我不必輸入所有這些查詢?

謝謝。

+0

你確定使用簡單的臨時表嗎? – TerrorAustralis 2010-05-11 02:45:03

回答

2

來看,主要的問題是,如果你做insert into <tableName> select * from <tableName>

這是我在一個可能的解決方案的猜測,你會得到一個主鍵衝突:

SELECT * 
INTO #tempTable 
FROM TableName 
WHERE autoid = 1234 

這得到你的價值觀。那麼你需要擺脫ID的

ALTER TABLE #tempTable 
DROP COLUMN autoid 

然後,只需插入此回主表

INSERT INTO tableName 
SELECT * FROM #tempTable 

我不是在SqlServer的槍,主要有與Sybase合作所以有可能一些語法問題。請隨時糾正我,我會改變我的回答

+0

我正在使用mysql。似乎沒有辦法對#tmptable執行INSERT(是嗎?)。看起來我必須對所有字段執行「CREATE TEMPORARY TABLE」,然後插入它。 – 2010-05-16 18:39:43

+0

標準的SQL語法是'SELECT [columns] INTO#Table'這應該創建一個新的表[名爲#Table],它具有在WHERE子句中指定的select和所有數據中指定的所有列,但看起來MySQL不支持這個(該博客給出了一些不需要的蹩腳藉口)。解決方法是使用這種語法:'CREATE TABLE #tempTable(SELECT * FROM TableName WHERE autoid = 1234)'這實際上應該做同樣的事情 – TerrorAustralis 2010-05-17 07:35:17

2

你可以說:

INSERT INTO tableName 
SELECT * from tableName WHERE autoid=1234; 
+1

出於好奇,不會嘗試插入AutoNumbered ID列以及其他,導致可能的主鍵違規?儘管在你的辯護中,OP發佈的查詢似乎有些不明確,但我認爲AutoID是ID,而不是Field1 – TerrorAustralis 2010-05-11 02:03:37

+0

是的,autoId是id字段不是需要複製的字段之一。 – 2010-05-11 03:27:08

+0

我修改了賈斯汀的答案併發布了它。它只涉及提取值,刪除ID並回傳到 – TerrorAustralis 2010-05-11 04:11:19

1
INSERT INTO tableName 
SELECT * from tableName 
WHERE autoid=1234; 

如果你在一個表中有50列,也許你應該重新考慮你的數據庫設計?在上述答案

+2

我從來沒有在*沒有*至少有一個或兩個約50場的表的應用程序工作。 :) – Kip 2010-05-11 01:30:11

+0

@Kip:我很確定這不是一件好事。 ;) – msw 2010-05-11 01:44:55

+0

不擅長:) – Randy 2010-05-11 02:02:21