Sql 基于字段更改的值设置标识列

Sql 基于字段更改的值设置标识列,sql,asp.net,sql-server-2008,identity,Sql,Asp.net,Sql Server 2008,Identity,我有一个表,其中我使用了一个identity作为主键(t_head_id),现在这个键变得非常长,这让客户端很不安,所以我们将它改为一个普通列select max+1,并添加了一个新的identity列(id),另一个列计算(id_per_year)作为id_per_year=id+'-'year(运营日期) 现在的问题是,我不想在年初重置id,而是当客户端开始插入新的operation\u date值时重置id,因为可以开始新的一年,但客户端仍在插入过去一年的记录 如何根据操作日期的变化值重置

我有一个表,其中我使用了一个
identity
作为主键(t_head_id),现在这个键变得非常长,这让客户端很不安,所以我们将它改为一个普通列select max+1,并添加了一个新的identity列(
id
),另一个列计算(
id_per_year
)作为id_per_year=id+'-'year(运营日期)

现在的问题是,我不想在年初重置id,而是当客户端开始插入新的
operation\u date
值时重置id,因为可以开始新的一年,但客户端仍在插入过去一年的记录


如何根据操作日期的变化值重置标识?

使用
标识属性定义类型为
INT
(或
SMALLINT、TINYINT、BIGINT
)的列:

CREATE TABLE dbo.YourTable( ID INT IDENTITY(1,1) ......
通过此设置,SQL Server将在表中插入行时自动为表生成连续的ID

使用类型
INT
,从1开始,您可以得到超过20亿行的,这对于绝大多数情况来说应该足够了。有了
BIGINT
,你大概可以得到922万亿(922,15个零-922.2万亿)-足够你用了吗

如果使用从1开始的
INT标识
,并且每秒插入一行,则需要66.5年才能达到20亿的上限

如果从1开始使用
BIGINT标识
,并且每秒插入1000行,那么在达到922万亿次极限之前,需要一个令人难以置信的2.92亿年

在中阅读更多关于它的信息(包括所有选项)

那么你真的需要更改你的
ID
列吗??如果您即将达到
INT
限制(我非常怀疑……),那么请更改为
BIGINT标识
-不要开始使用
SELECT MAX()+1
之类的东西,因为它本质上是不安全的,最终会在负载下打破并产生重复值-请确保您自己的安全,坚持使用
标识


2.92亿年听起来对你来说还不够吗?

你可以检查当前年份并添加这些内容。这不是身份栏的工作,请不要这样做!
SELECT MAX()+1
方法是完全不安全的!在一个只有少量并发使用的系统中,您将得到重复的!别这样!这将在未来给你带来巨大的痛苦和头痛。。。。。。。使用
IDENTITY
——这是处理并发性和获得安全的“ID”号的唯一可行方法。我更改了我的帖子,我想现在很明显海报上并没有特别清楚他们想做什么,但我推测他们实际上是在一年内寻找某种序列号。id_per_year=1-2015有效地告诉您,这是2015年内的第一笔交易。亲爱的,不幸的是,我仍然需要我的更改,我只需要合适的方法