你如何复制记录在一个SQL表,但换出新行的唯一ID?(How do you copy a recor

2019-07-20 05:34发布

这个问题来接近我所需要的,但我的情况略有不同。 源表和目标表是相同的,主键是唯一标识符(GUID)。 当我试试这个:

insert into MyTable
    select * from MyTable where uniqueId = @Id;

我明明得到了主键约束冲突,因为我试图在主键复制。 其实,我并不想在全国各地的主键复制。 相反,我想创建一个新的。 此外,我想在选择某些字段复制,并离开他人空。 为了使问题更复杂,我需要采取原始的记录的主键,把它插入到在副本(PreviousId场)另一个领域。

我敢肯定,有一个简单的解决方案,这一点,我只是不知道够不够TSQL知道它是什么。

Answer 1:

试试这个:

 insert into MyTable(field1, field2, id_backup) select field1, field2, uniqueId from MyTable where uniqueId = @Id; 

未指定任何字段应该接收它们的默认值(通常是NULL没有定义时)。



Answer 2:

好吧,我知道这是一个老问题,但我无论如何张贴我的答案。

我喜欢这个解决方案。 我只需要指定标识列(S)。

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;

“标识” -column是标识列,这就是我必须指定的唯一列。 它比其他的方式更好地围绕反正。 :-)

我使用SQL Server。 您可能需要使用“ CREATE TABLE ”和“ UPDATE TABLE在行1和2嗯”,我看到了,我并没有真正给他想要的答案。 他想的ID复制到另一列也。 但这种解决方案是用于制作副本与新的自动编号不错。

编辑我与迈克尔Dibbets想法的解决方案。

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应该与你的名字(当然)所取代。



Answer 3:

指定各个领域,但你的ID字段。

INSERT INTO MyTable (FIELD2, FIELD3, ..., FIELD529, PreviousId)
SELECT FIELD2, NULL, ..., FIELD529, FIELD1
FROM MyTable
WHERE FIELD1 = @Id;


Answer 4:

我猜你想避免写出来的所有列名。 如果您使用SQL Management Studio中,你可以很容易地右键点击表格和脚本插入..然后你可以与输出周围乱来创建查询。



Answer 5:

insert into MyTable (uniqueId, column1, column2, referencedUniqueId)
select NewGuid(), // don't know this syntax, sorry
  column1,
  column2,
  uniqueId,
from MyTable where uniqueId = @Id


Answer 6:

我有我想要一个简单的脚本,以使用具有其他开发人员定期添加列的表工作了同样的问题。 不仅如此,但我支持许多不同的版本我们的数据库作为客户可能不是所有上最新与当前版本。

我由乔纳斯了解决方案,并修改了它略有下降。 这让我做该行的副本,然后将它放回原来的源表之前更改主键。 这也与表不允许列中的NULL值的工作非常方便,你不希望有在INSERT指定每个列名。

此代码拷贝的行为“ABC”到“XYZ”

SELECT * INTO #TempRow FROM SourceTable WHERE KeyColumn = 'ABC';
UPDATE #TempRow SET KeyColumn = 'XYZ';
INSERT INTO SourceTable SELECT * FROM #TempRow;
DELETE #TempRow;

一旦你完成了下降的临时表。

DROP TABLE #TempRow;


Answer 7:

如果“钥匙”是你的PK场,它的autonumeric。

insert into MyTable (field1, field2, field3, parentkey)
select field1, field2, null, key from MyTable where uniqueId = @Id

它会产生一个新的记录,从原来的唱片复制FIELD1和FIELD2



Answer 8:

我的表有100个字段,我需要一个查询,只是工作。 现在我可以切换出任意数量的字段的一些基本条件逻辑,而不必担心它的顺序位置。

  1. 与你的表名称替换下面的表名

     SQLcolums = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE (TABLE_NAME = 'TABLE-NAME')" Set GetColumns = Conn.Execute(SQLcolums) Do WHILE not GetColumns.eof colName = GetColumns("COLUMN_NAME") 
  2. 与你PK场名称替换原来的标识字段名

     IF colName = "ORIGINAL-IDENTITY-FIELD-NAME" THEN ' ASSUMING THAT YOUR PRIMARY KEY IS THE FIRST FIELD DONT WORRY ABOUT COMMAS AND SPACES columnListSOURCE = colName columnListTARGET = "[PreviousId field name]" ELSE columnListSOURCE = columnListSOURCE & colName columnListTARGET = columnListTARGET & colName END IF GetColumns.movenext loop GetColumns.close 
  3. 再次更换表名(包括目标表名和源表名); 编辑where条件

     SQL = "INSERT INTO TARGET-TABLE-NAME (" & columnListTARGET & ") SELECT " & columnListSOURCE & " FROM SOURCE-TABLE-NAME WHERE (FIELDNAME = FIELDVALUE)" Conn.Execute(SQL) 


Answer 9:

我知道我的答案是迟到了。 但我解决了这个方式比所有的答案有点不同。

我有一个情况,我需要克隆一个表中的行除了几列。 那几个将有新的价值观。 这一过程应为表未来的变化自动支持。 这意味着,克隆记录不指定任何列名。

我的做法是,

  1. 查询SYS.COLUMNS获得为表列的完整列表,其中包括列的名称跳过where子句。
  2. 转换,在以CSV列名。
  3. 构建选择...插入基于这个脚本。

 declare @columnsToCopyValues varchar(max), @query varchar(max) SET @columnsToCopyValues = '' 

--get所有execpt标识列和其他列的列被排除。 说IndentityColumn,列1,列2选择@columnsToCopyValues = @columnsToCopyValues +从SYS.COLUMNS C [名称] + ' '其中c.object_id = OBJECT_ID(' YourTableName ')和名称不(' IndentityColumn', '列1',”列2' )选择@columnsToCopyValues = SUBSTRING(@columnsToCopyValues,0,LEN(@columnsToCopyValues))打印@columnsToCopyValues

选择@query = CONCAT( '插入YourTableName(',@ columnsToCopyValues, '列1,列2)选择',@columnsToCopyValues,”, '' 值1 '', '' 值2 '', '' 从YourTableName其中IndentityColumn = ''”,@searchVariable, '' '')

打印@query EXEC(@query)



Answer 10:

你可以这样做:

INSERT INTO DENI/FRIEN01P 
SELECT 
   RCRDID+112,
   PROFESION,
   NAME,
   SURNAME,
   AGE, 
   RCRDTYP, 
   RCRDLCU, 
   RCRDLCT, 
   RCRDLCD 
FROM 
   FRIEN01P      

有代替112你应该把一些表DENI / FRIEN01P最大的ID。



Answer 11:

这里是我做到了使用ASP经典,不能完全得到它与上面的答案工作,我希望能够在我们的系统复制产品到一个新的product_id和需要它也能进行工作的时候,我们添加更多的列在表中。

Cn.Execute("CREATE TEMPORARY TABLE temprow AS SELECT * FROM product WHERE product_id = '12345'")
Cn.Execute("UPDATE temprow SET product_id = '34567'")
Cn.Execute("INSERT INTO product SELECT * FROM temprow")
Cn.Execute("DELETE temprow")
Cn.Execute("DROP TABLE temprow")


文章来源: How do you copy a record in a SQL table but swap out the unique id of the new row?