如何更新SQL Server中的标识列?

我有SQL Server数据库,我想更改标识列,因为它开始与一个大数字10010 ,它与另一个表相关,现在我有200条logging,我想在logging增加之前解决此问题。

什么是最好的方法来改变或重置此列?

使用DBCC CHECKIDENT

 DBCC CHECKIDENT('tableName', RESEED, NEW_RESEED_VALUE) 

如果你想更新现有logging的标识列的值,那么你需要设置

 set identity_insert YourTable ON 

 -- Set Identity insert on so that value can be inserted into this column SET IDENTITY_INSERT YourTable ON GO -- Insert the record which you want to update with new value in identity column INSERT INTO YourTable(IdentityCol, otherCol) VALUES(13,'myValue') GO -- Delete the old row of which you have inserted a copy (above) (make sure about FK's) DELETE FROM YourTable WHERE ID=3 GO --Now set the idenetity_insert OFF to back to prevoius track SET IDENTITY_INSERT YourTable OFF 

如果你的问题得到解决,你想要做一些类似的事情

 update table set identity_column_name = some value 

让我告诉你,这不是一个容易的过程,它是不可取的,因为可能有一些foreign key相关联。

但是这里有一些步骤可以做,请back-up表格

步骤1-select表格的devise视图

在这里输入图像说明

步骤2-closures标识列

在这里输入图像说明

现在您可以使用update查询。

现在redo执行步骤1和步骤2并打开标识列

参考

你需要

 set identity_insert YourTable ON 

然后删除你的行,重新插入不同的身份。

一旦你完成插入不要忘记closuresidentity_insert

 set identity_insert YourTable OFF 
 --before running this make sure Foreign key constraints have been removed that reference the ID. --set table to allow identity to be inserted SET IDENTITY_INSERT yourTable ON; GO --insert everything into a temp table SELECT * INTO #tmpYourTable FROM yourTable --clear your table DELETE FROM yourTable --insert back all the values with the updated ID column INSERT INTO yourTable (IDCol, OtherCols) SELECT ID+1 as updatedID --put any other update logic to the ID here , OtherCols FROM #tmpYourTable --drop the temp table DROP TABLE #tmpYourTable --put identity back to normal SET IDENTITY_INSERT yourTable OFF; GO 

将您的表复制到一个没有标识列的新表。

  select columns into newtable from yourtable 

将新的种子添加到新表的标识列,并将其作为主键

  ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY 

尝试使用DBCC CHECKIDENT

 DBCC CHECKIDENT ('YourTable', RESEED, 1); 
 DBCC CHECKIDENT(table_name, RESEED, value) 

table_name =给你想要重置值的表

值=初始值为零,以1开始标识列

您还可以使用SET IDENTITY INSERT来允许您将值插入到标识列中。

例:

 SET IDENTITY_INSERT dbo.Tool ON GO 

然后你可以插入到你需要的值的标识列中。

(为使用命令生成器的c#程序员提供完整的解决scheme)

首先,你必须知道这个事实: – 无论如何,你不能修改一个标识列,所以你必须删除该行,并重新添加新的身份。 – 您无法从列中删除标识属性(您必须将其删除到列) – .net中的定制命令生成器始终跳过标识列,因此您无法将其用于此purprose。

所以,一旦知道了,你必须做的是。 既可以编写自己的SQL插入语句,也可以编写自己的插入命令生成器。 或者使用我为你编写的这个。 给定一个数据表,生成SQL插入脚本:

 public static string BuildInsertSQLText ( DataTable table ) { StringBuilder sql = new StringBuilder(1000,5000000); StringBuilder values = new StringBuilder ( "VALUES (" ); bool bFirst = true; bool bIdentity = false; string identityType = null; foreach(DataRow myRow in table.Rows) { sql.Append( "\r\nINSERT INTO " + table.TableName + " (" ); foreach ( DataColumn column in table.Columns ) { if ( column.AutoIncrement ) { bIdentity = true; switch ( column.DataType.Name ) { case "Int16": identityType = "smallint"; break; case "SByte": identityType = "tinyint"; break; case "Int64": identityType = "bigint"; break; case "Decimal": identityType = "decimal"; break; default: identityType = "int"; break; } } else { if ( bFirst ) bFirst = false; else { sql.Append ( ", " ); values.Append ( ", " ); } sql.Append ("["); sql.Append ( column.ColumnName ); sql.Append ("]"); //values.Append (myRow[column.ColumnName].ToString() ); if (myRow[column.ColumnName].ToString() == "True") values.Append("1"); else if (myRow[column.ColumnName].ToString() == "False") values.Append("0"); else if(myRow[column.ColumnName] == System.DBNull.Value) values.Append ("NULL"); else if(column.DataType.ToString().Equals("System.String")) { values.Append ("'"+myRow[column.ColumnName].ToString()+"'"); } else values.Append (myRow[column.ColumnName].ToString()); //values.Append (column.DataType.ToString() ); } } sql.Append ( ") " ); sql.Append ( values.ToString () ); sql.Append ( ")" ); if ( bIdentity ) { sql.Append ( "; SELECT CAST(scope_identity() AS " ); sql.Append ( identityType ); sql.Append ( ")" ); } bFirst = true; sql.Append(";"); values = new StringBuilder ( "VALUES (" ); }//fin foreach return sql.ToString (); ; } 

我已经解决了这个问题首先使用DBCC,然后使用插入。 例如,如果你的表是

首先在表上设置新的当前ID值为NEW_RESEED_VALUE

MyTable {IDCol,colA,colB}

  DBCC CHECKIDENT('MyTable', RESEED, NEW_RESEED_VALUE) 

那么你可以使用

  insert into MyTable (colA, ColB) select colA, colB from MyTable 

这将复制所有logging,但是使用以NEW_RESEED_VALUE开头的新IDCol值。 如果有的话,您可以删除/移动外键引用,然后删除更高的ID值重复行。

您可以使用以下代码创build一个新表。

 SELECT IDENTITY (int, 1, 1) AS id, column1, column2 INTO dbo.NewTable FROM dbo.OldTable 

然后删除旧的数据库,并将新的数据库重命名为旧的数据库的名称。 注意 :column1和column2表示您希望保留在新表中的旧表中的所有列。