2012-03-12 67 views
-1

。 我喜欢插入行标识列被删除与原始值,但不知道如何这样做。在SQL SERVER 2010中,我删除了一些使用标识字段的列,删除了标识列

我试图修改,但身份柱灰色

UPDATE table 
+2

没有SQL Server版本** 2010 ** ....你在用什么?另外:**为什么**麻烦重新循环那些使用的身份值?你从中得到什么?看起来好像很多工作没有好处,真的...... – 2012-03-12 17:34:35

+2

重用身份值是一个非常糟糕的主意。 YOu永远不能依赖身份不要跳过值(即使你回滚查询也会使用它们),所以没有任何理由试图重用它们。如果您的相关表格没有定义的PK/FK结构(您不应该这样做),将新数据与旧数字相对应会将错误记录与它们联系起来,因为这些旧记录不会与父记录一起删除。 – HLGEM 2012-03-12 17:48:11

回答

2
SET IDENTITY_INSERT [YourTableName] ON 
--do your update/insert query here 
SET IDENTITY_INSERT [YourTableName] OFF 
+1

我认为说'SQL SERVER 2010'是一个错误。这是他的要求的解决方案,它适用于SQL SERVER 2000及更高版本。 [SET IDENTITY_INSERT - MSDN](http://msdn.microsoft.com/zh-cn/library/aa259221(v=sql.80).aspx) – Kaf 2012-03-12 18:00:50

+1

我会给你回复某人从你身上拿走的+1 ,因为你确实回答了如何重用身份值的问题。然而,上面提到的关于这样做(和毫无意义)的危险的观点不应该被忽视。 – 2012-03-12 18:22:07

+0

@AaronBertrand - 感谢和对待! – Kaf 2012-03-12 18:34:26

-2

您需要补种的身份:

dbcc checkident (mytable, reseed, 30) 
+2

但是** **可能会导致重复,如果值高于例如在你的示例中有30个存在! **这个操作非常小心**!将一个IDENTITY重新转换为一个给定的值,不会**跳过比已重置值高的现有值 - 这是一种常见的误解! – 2012-03-12 17:35:28

+1

这是对的,为什么?因为IDENTITY属性本身并不强制执行唯一性。我在这里发表了一些关于IDENTITY列的类似误解:http://sqlblog.com/blogs/aaron_bertrand/archive/2012/02/27/bad-habits-to-kick-believing-everything-you-hear-or-read .aspx – 2012-03-12 17:56:37

1

你能解释为什么你关心是否有差距的身份专栏?如果您只想在标签旁边添加一些漂亮的ID号码(并且不担心其他表格中的相关数据,或者即使删除了ID 1,第二行是否保留ID 2),您始终可以导出这些无意义的ID号码在运行时,例如

SELECT col, MeaninglessID = ROW_NUMBER() OVER (ORDER BY col) 
FROM dbo.table 
ORDER BY col; 
+1

我刚刚意识到这是我的第1,000个答案。 – 2012-03-12 18:44:44

+0

WOOOHOOOO !!! ;-)恭喜 - 期待数以千计:-) – 2012-03-12 20:02:57

+0

谢谢马克,我有很多方法可以抓住你。 :-) – 2012-03-12 20:10:17