如何复制SQL表中的logging,但换出新行的唯一ID?
这个问题接近我所需要的,但是我的情况稍有不同。 源表和目标表是相同的,主键是唯一标识符(guid)。 当我尝试这个:
insert into MyTable select * from MyTable where uniqueId = @Id;
我显然得到主键约束违规,因为我试图通过主键复制。 其实我根本不想复制主键。 相反,我想创造一个新的。 此外,我想有select地复制某些字段,并将其他字段留空。 为了使事情更复杂,我需要把原始logging的主键,并将其插入副本(PreviousId字段)中的另一个字段。
我确信有一个简单的解决scheme,我只是不知道足够的TSQL知道它是什么。
尝试这个:
insert into MyTable(field1, field2, id_backup) select field1, field2, uniqueId from MyTable where uniqueId = @Id;
任何未指定的字段应该接收到它们的默认值(当没有定义时通常是NULL)。
好吧,我知道这是一个老问题,但我反正张贴我的答案。
我喜欢这个解决scheme。 我只需指定标识列(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;
“id” – 列是标识列,这是我必须指定的唯一列。 反正比其他方式更好。 🙂
我使用SQL Server。 你可能想在第一和第二行使用“ CREATE TABLE
”和“ UPDATE TABLE
”。嗯,我看到我没有给出他想要的答案。 他想把id复制到另一列。 但是这个解决scheme对于使用新的auto-id进行复制是非常好的。
我用Michael Dibbets的idéas编辑我的解决scheme。
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应该被replace为你想要复制的行的id。 MyDatabase,MyTable和IndexField应该replace为你的名字(当然)。
指定所有字段,但是您的ID字段。
INSERT INTO MyTable (FIELD2, FIELD3, ..., FIELD529, PreviousId) SELECT FIELD2, NULL, ..., FIELD529, FIELD1 FROM MyTable WHERE FIELD1 = @Id;
我猜你试图避免写出所有的列名。 如果您使用的是SQL Management Studio,您可以轻松地右键单击表格并以脚本作为插入,然后您可以使用该输出来创build查询。
insert into MyTable (uniqueId, column1, column2, referencedUniqueId) select NewGuid(), // don't know this syntax, sorry column1, column2, uniqueId, from MyTable where uniqueId = @Id
如果“钥匙”是你的PK领域,它是自动数字。
insert into MyTable (field1, field2, field3, parentkey) select field1, field2, null, key from MyTable where uniqueId = @Id
它会生成一条新的logging,从原始logging复制field1和field2
你可以这样做:
INSERT INTO DENI/FRIEN01P SELECT RCRDID+112, PROFESION, NAME, SURNAME, AGE, RCRDTYP, RCRDLCU, RCRDLCT, RCRDLCD FROM FRIEN01P
而不是112,你应该在表DENI / FRIEN01P中放置一个最大的ID号码。
我的表有100个字段,我需要一个查询才能正常工作。 现在我可以用一些基本的条件逻辑来切换任意数量的字段,而不用担心它的序位。
-
用你的表名replace下面的表名
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")
-
用您的PK字段名称replace原始的身份字段名称
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
-
再次replace表名(目标表名和源表名); 编辑你的条件
SQL = "INSERT INTO TARGET-TABLE-NAME (" & columnListTARGET & ") SELECT " & columnListSOURCE & " FROM SOURCE-TABLE-NAME WHERE (FIELDNAME = FIELDVALUE)" Conn.Execute(SQL)
我有同样的问题,我希望单个脚本与其他开发人员定期添加列的表一起工作。 不仅如此,我还支持我们数据库的许多不同版本,因为客户可能并不都知道当前版本的最新版本。
我拿了乔纳斯的解决scheme,稍微修改它。 这使我可以复制该行,然后在将其添加回原始源表之前更改主键。 这对于处理不允许在列中使用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;