这个问题接近我的需要,但我的情况略有不同.源表和目标表是相同的,主键是uniqueidentifier(guid).当我尝试这个:
insert into MyTable select * from MyTable where uniqueId = @Id;
我显然遇到了主键约束违规,因为我试图复制主键.实际上,我根本不想复制主键.相反,我想创建一个新的.另外,我想有选择地复制某些字段,并将其他字段留空.为了使事情变得更复杂,我需要获取原始记录的主键,并将其插入副本中的另一个字段(PreviousId字段).
我确信有一个简单的解决方案,我只是不知道足够的TSQL知道它是什么.
试试这个:
insert into MyTable(field1, field2, id_backup) select field1, field2, uniqueId from MyTable where uniqueId = @Id;
未指定的任何字段都应接收其默认值(未定义时通常为NULL).
好的,我知道这是一个老问题,但无论如何我都会发布我的答案.
我喜欢这个解决方案.我只需要指定标识列.
SELECT * INTO TempTable FROM MyTable_T WHERE id = 1; ALTER TABLE TempTable DROP COLUMN id; INSERT INTO MyTable_T SELECT * FROM TempTable; DROP TABLE TempTable;
"id"列是标识列,这是我必须指定的唯一列.无论如何,它比其他方式更好.:-)
我使用SQL Server.你可能想在第1行和第2行使用" CREATE TABLE
"和" UPDATE TABLE
".嗯,我看到我并没有真正给出他想要的答案.他也希望将id复制到另一列.但是这个解决方案很适合用新的auto-id制作副本.
我用Michael Dibbets的idéas编辑我的解决方案.
use MyDatabase; SELECT * INTO #TempTable FROM [MyTable] WHERE [IndexField] = :id; ALTER TABLE #TempTable DROP COLUMN [IndexField]; INSERT INTO [MyTable] SELECT * FROM #TempTable; DROP TABLE #TempTable;
您可以通过用","分隔多个列来删除它们.:id应替换为要复制的行的id.MyDatabase,MyTable和IndexField应该替换为您的名字(当然).
我猜你在试图避免写出所有的列名.如果您正在使用SQL Management Studio,则可以轻松地右键单击表格和脚本为插入...然后您可以使用该输出来创建查询.
指定除ID字段之外的所有字段.
INSERT INTO MyTable (FIELD2, FIELD3, ..., FIELD529, PreviousId) SELECT FIELD2, NULL, ..., FIELD529, FIELD1 FROM MyTable WHERE FIELD1 = @Id;