2010-05-11 138 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