更新 SQL 服务器中的标识列并设置种子起始值
Updating identity column in SQL Server and setting the seed starting value
我有一个 table 填充了数据,其中一列 - TrackingNumber - 是一个整数值。我收到了将其更改为自动递增并让它以 1000000 开始标识种子的请求。我知道我无法将列更改为现有 table 中带有数据的标识列,所以我有两个选项:要么创建一个全新的 table,然后将数据从旧的 table 移动到新的 table 中,要么添加一个新的标识列并使用旧列中的数据更新它。
问题是我需要保留 TrackingNumber 列中的所有现有值。我尝试了以下方法:
1) ALTER TABLE [dbo].[Table1]
ADD [TrackingNumber2] [bigint] IDENTITY (1000000, 1) NOT NULL
2) UPDATE [dbo].[Table1]
SET [TrackingNumber2]=[TrackingNumber]
3) ALTER TABLE [dbo].[Table1]
DROP COLUMN [TrackingNumber]
GO
4) EXEC sp_rename 'Table1.TrackingNumber2', 'TrackingNumber','COLUMN'
我在第 2 步中遇到错误 - 使用旧列中的值更新新列:"Cannot update identity column 'TrackingNumber2'"
谁能推荐解决方法?
您只需为此 table 设置 identity_insert 即可更新值。确保在完成更新后将其关闭。 :)
您确定您需要使用标识列吗?还有其他选择。例如,由于 SQL Server 2012(还有 Azure),这些东西称为序列。您可以定义一个序列以您喜欢的任何数字开始:
create sequence dbo.TrackingSequence
as int
start with 1000000
increment by 1
no maxvalue
no cycle
no cache
然后,您可以更改 table,使相关列的默认值 defaults 来自序列:
alter table dbo.MyTable
add constraint [MyTable.TrackingNumber.Default.TrackingSequence]
default( next value for dbo.TrackingSequence ) for TrackingNumber
(如果该列已有默认值,您需要先将其删除 - 在单独的语句中。)
序列的工作方式很像标识,但您不必破坏现有值或列定义本身。
唯一的技巧是记住不要指定 TrackingNumber 的值,让数据库做它的事情。
序列很酷,因为您可以让多个 table 使用一个序列,与过去的替代方案相比,您的数据库范围内的唯一 ID 稍微短一些。对于这样的应用程序,您最好使用 bigint 列 - 或者知道所讨论的 tables 不会太长。
我最终创建了一个新的 table 并在其中移动了数据
我有一个 table 填充了数据,其中一列 - TrackingNumber - 是一个整数值。我收到了将其更改为自动递增并让它以 1000000 开始标识种子的请求。我知道我无法将列更改为现有 table 中带有数据的标识列,所以我有两个选项:要么创建一个全新的 table,然后将数据从旧的 table 移动到新的 table 中,要么添加一个新的标识列并使用旧列中的数据更新它。
问题是我需要保留 TrackingNumber 列中的所有现有值。我尝试了以下方法:
1) ALTER TABLE [dbo].[Table1]
ADD [TrackingNumber2] [bigint] IDENTITY (1000000, 1) NOT NULL
2) UPDATE [dbo].[Table1]
SET [TrackingNumber2]=[TrackingNumber]
3) ALTER TABLE [dbo].[Table1]
DROP COLUMN [TrackingNumber]
GO
4) EXEC sp_rename 'Table1.TrackingNumber2', 'TrackingNumber','COLUMN'
我在第 2 步中遇到错误 - 使用旧列中的值更新新列:"Cannot update identity column 'TrackingNumber2'"
谁能推荐解决方法?
您只需为此 table 设置 identity_insert 即可更新值。确保在完成更新后将其关闭。 :)
您确定您需要使用标识列吗?还有其他选择。例如,由于 SQL Server 2012(还有 Azure),这些东西称为序列。您可以定义一个序列以您喜欢的任何数字开始:
create sequence dbo.TrackingSequence
as int
start with 1000000
increment by 1
no maxvalue
no cycle
no cache
然后,您可以更改 table,使相关列的默认值 defaults 来自序列:
alter table dbo.MyTable
add constraint [MyTable.TrackingNumber.Default.TrackingSequence]
default( next value for dbo.TrackingSequence ) for TrackingNumber
(如果该列已有默认值,您需要先将其删除 - 在单独的语句中。)
序列的工作方式很像标识,但您不必破坏现有值或列定义本身。
唯一的技巧是记住不要指定 TrackingNumber 的值,让数据库做它的事情。
序列很酷,因为您可以让多个 table 使用一个序列,与过去的替代方案相比,您的数据库范围内的唯一 ID 稍微短一些。对于这样的应用程序,您最好使用 bigint 列 - 或者知道所讨论的 tables 不会太长。
我最终创建了一个新的 table 并在其中移动了数据