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中创建动态行?

如何在不删除sql server表中数据的情况下,让自增的id列从1开始

如何在不删除sql server表中数据的情况下,让自增的id列从1开始

在不知道 SQL 中的列的情况下创建表

在不使用 SQL 游标的情况下插入行和更新表