SQL Server:在行更新时为标识列重新生成值

Rya*_*man 1 sql sql-server database-design

SequenceId 是一个自动递增的标识列,但不是主键.

我想要发生的是当一行更新时,SequenceId设置为下一个可用值,例如:

_____________________
| SequenceId | Name |
| 1          | John |
| 2          | Jane |
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Run Code Online (Sandbox Code Playgroud)

将约翰更新为杰克.SequenceId设置为下一个可用的标识值.

_____________________
| SequenceId | Name |
| 3          | Jack |
| 2          | Jane |
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Run Code Online (Sandbox Code Playgroud)

这可能与SQL Server一起使用吗?如果没有,那将是另一种选择?

Jas*_*aat 6

我认为你不能,至少不容易或干净.为什么不使用ROWVERSION列?每次将行更新为数据库中新的唯一递增值时,ROWVERSION列都会更新.您可以创建一个计算列,如果要对其进行索引,则将其转换为bigint.缺点是时间戳是数据库范围的,所以如果有多个表使用它们,你可以跳过数字.

小提琴

create table TestRowVersion (
    Id int primary key,
    Name varchar(20),
    BinaryRowVersion ROWVERSION,
    IntegerRowVersion as convert(BIGINT, BinaryRowVersion)
)   

create index IDX_TestRowVersion on TestRowVersion (IntegerRowVersion)

insert into TestRowVersion (Id, Name) values (1, 'Alvin')
insert into TestRowVersion (Id, Name) values (2, 'Betsy')
insert into TestRowVersion (Id, Name) values (3, 'Charles')
select * From TestRowVersion
update TestRowVersion set Name = 'Frank' where Id = 2
select * From TestRowVersion
Run Code Online (Sandbox Code Playgroud)

[编辑] - 更新为使用RowVersion,因为不推荐使用时间戳