SQL如何在不自动递增ID列的情况下插入行?
我有一个表,它有一个强制自动递增列,这个列是一个非常有价值的ID,在整个应用程序中都会保留。很抱歉,这是一个糟糕的发展,对我来说,这是自动递增列 所以,问题出在这里。我必须在此表中插入已创建并从表中删除的列的ID。有点像复活这个ID然后把它放回桌子上SQL如何在不自动递增ID列的情况下插入行?,sql,sql-server,auto-increment,Sql,Sql Server,Auto Increment,我有一个表,它有一个强制自动递增列,这个列是一个非常有价值的ID,在整个应用程序中都会保留。很抱歉,这是一个糟糕的发展,对我来说,这是自动递增列 所以,问题出在这里。我必须在此表中插入已创建并从表中删除的列的ID。有点像复活这个ID然后把它放回桌子上 那么,我如何在不关闭列增量的情况下通过编程实现这一点呢。如果我错了,请纠正我,如果我以编程方式将其关闭,它将在0或1处重新启动,我不希望发生这种情况…如果您在Microsoft SQL Server中,您可以通过在上发出语句Set Identity
那么,我如何在不关闭列增量的情况下通过编程实现这一点呢。如果我错了,请纠正我,如果我以编程方式将其关闭,它将在0或1处重新启动,我不希望发生这种情况…如果您在Microsoft SQL Server中,您可以通过在上发出语句
Set Identity\u Insert[TableName]来“关闭”自动递增功能,如下所示:
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
除了Charles的答案(现在100%正确:-)和保留表上标识的当前值外,您可能还希望检查表上标识的当前值-您可以使用以下命令执行此操作:
DBCC CHECKIDENT('YourTableName')
DBCC CHECKIDENT ('YourTableName', RESEED, (new value for IDENTITY) )
如果您需要实际更改它,您可以在此处使用以下命令:
DBCC CHECKIDENT('YourTableName')
DBCC CHECKIDENT ('YourTableName', RESEED, (new value for IDENTITY) )
实际上,上面的INDENTITY_INSERT代码是正确的-打开它会告诉服务器您想自己插入值。它允许您在标识列中插入值。然后,您希望在完成后将其关闭(允许服务器生成和插入值)。它是否保留递增标识的最后一个数字?我不想让它自己重置整个标识列,@Scott,是的,它“保留”了旧值。。。i、 例如,此参数不影响下一个自动增量标识使用的“当前”值t obe…我知道这是一个旧线程,但在SSMS 2012中,它没有保留旧值。我按照上面的例子,插入了一个999999的id,关闭了identity_insert“OFF”,插入了一条新记录,它给了我1000000,而不是下一个应该是72597的数字。我正在进一步研究这个问题。只有当插入的值小于旧值时,它才会“保留”旧值。。。我(错误地)假设这样做的目的是插入一个带有以前使用但已删除的旧值的值,需要重新插入。请注意,对于此问题,您只需在query.MS-SQL server的SELECT子句中显式列……请解释此答案解决问题的原因。阅读
bulk insert tablename from 'C:\test.csv' with (rowterminator = '\n',fieldterminator = ',',KEEPIDENTITY)