SQL-如何在不自动增加 ID 列的情况下插入行?
Posted
技术标签:
【中文标题】SQL-如何在不自动增加 ID 列的情况下插入行?【英文标题】:SQL-How to Insert Row Without Auto incrementing a ID Column? 【发布时间】:2010-11-06 04:24:55 【问题描述】:我有一个包含强制自动递增列的表,该列是一个非常有价值的 ID,在整个应用程序中都会保留。很抱歉,将它作为自动递增列对我来说是一个糟糕的发展。
所以,这就是问题所在。我必须在这个表中插入一个已经创建并从表中删除的列的 ID。有点像复活这个 ID 并将其放回表中。
那么如何在不关闭列增量的情况下以编程方式执行此操作。如果我错了,请纠正我,如果我以编程方式将其关闭,它将在 0 或 1 处重新启动,我不希望这种情况发生......
【问题讨论】:
这个问题的MS-SQL服务器... 【参考方案1】:如果您在 Microsoft SQL Server 中,您可以通过发出语句 Set Identity_Insert [TableName] On
来“关闭”自动增量功能,如下所示:
Set Identity_Insert [TableName] On
-- --------------------------------------------
Insert TableName (pkCol, [OtherColumns])
Values(pkValue, [OtherValues])
-- ---- Don't forget to turn it back off ------
Set Identity_Insert [TableName] Off
【讨论】:
它是否保留递增标识的最后一个数字?我不希望它自行重置整个身份列... 和@Scott,是的,它“保留”旧值...即,此过程不会影响用于下一个自动增量身份的“当前”值... 我知道这是一个旧线程,但在 SSMS 2012 中,它没有保留旧值。我按照上面的例子,插入了一个 999999 的 id,将 identity_insert 设置为“OFF”,插入了一条新记录,它给了我 1000000,而不是下一个应该是 72597 的数字。我正在进一步调查。 只有当插入的值小于旧值时,它才会“保留”旧值......我(错误地)假设这样做的目的是插入一个旧的值,以前已使用但已删除,需要重新插入值。 请注意,您只需在查询的 SELECT 子句中显式列。【参考方案2】:除了 Charles 的回答(现在 100% 正确 :-) 并且保留了表上 IDENTITY 的当前值)之外,您可能还想检查表上 IDENTITY 的当前值 - 您可以在此处使用此命令执行此操作:
DBCC CHECKIDENT('YourTableName')
如果您需要真正更改它,您可以在此处使用以下命令:
DBCC CHECKIDENT ('YourTableName', RESEED, (new value for IDENTITY) )
【讨论】:
【参考方案3】:实际上,上面的 INDENTITY_INSERT 代码是正确的 - 将其打开会告诉服务器您要自己插入值。它允许您将值插入 IDENTITY 列。然后,您希望在完成后将其关闭(允许服务器生成并插入值)。
【讨论】:
【参考方案4】:bulk insert tablename from 'C:\test.csv' with (rowterminator = '\n',fieldterminator = ',',KEEPIDENTITY)
【讨论】:
请解释为什么这个答案可以解决问题。阅读How do I write a good answer?以上是关于SQL-如何在不自动增加 ID 列的情况下插入行?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不将数据输入自动编号列的情况下将数据插入 MS Access 表?
如何在不删除sql server表中数据的情况下,让自增的id列从1开始