Sql server SQL Server序列常量重新启动

Sql server SQL Server序列常量重新启动,sql-server,Sql Server,我正在研究一种模式,其中SQLServer序列被用作记录的子索引,并使用每一组新记录重置 比如: create sequence dbo.MySequence start with 1 increment by 1; create table dbo.Addresses ( PersonID int ,AddressSequence int ,StreetAddress varchar(100) ); declare @PersonID int; set @Pe

我正在研究一种模式,其中SQLServer序列被用作记录的子索引,并使用每一组新记录重置

比如:

create sequence dbo.MySequence start with 1 increment by 1;
create table dbo.Addresses (
    PersonID int
    ,AddressSequence int
    ,StreetAddress varchar(100)
);
    
declare @PersonID int;
set @PersonID = 1;
alter sequence dbo.MySequence restart with 1;
insert dbo.Addresses (PersonID, AddressSequence, StreetAddress)
values (@PersonID, next value for dbo.MySequence, '123');
insert dbo.Addresses (PersonID, AddressSequence, StreetAddress)
values (@PersonID, next value for dbo.MySequence, '456');

set @PersonID = 2;
alter sequence dbo.MySequence restart with 1;
insert dbo.Addresses (PersonID, AddressSequence, StreetAddress)
values (@PersonID, next value for dbo.MySequence, '789');

PersonID    AddressSequence StreetAddress
----------- --------------- ---------------
1           1               123
1           2               456
2           1               789
对于每一个新人,序列都会更改回1。在某些情况下,这显然是不好的。在这个特定的场景中,记录只插入一次,从不进行编辑,仅由这一个应用程序执行,没有并行/线程,并且在转移到下一个人之前始终插入所有地址

在现有的情况下,它似乎可以正常工作。当然,这意味着我们永远不能改变这些需求,就像让多个进程同时进行插入一样


但假设一切正常,这里有什么东西会伤害我们吗?我希望更改数据库对象比增加或重置内存中的变量需要更多的工作,但是否还有其他问题需要我研究或传递给DBA?

没有简单、高效、可扩展的方法来做到这一点。您应该只允许AddressSequence在PersonId之间递增。在大多数情况下,它在功能上是等价的。乙二醇

PersonID    AddressID       StreetAddress
----------- --------------- ---------------
1           1               123
1           2               456
2           3               789
2           4               789
带有PK(PersonID,AddressID)


出于显示的目的,您可以始终使用类似以下表达式生成AddressSequence(按地址ID按人名顺序划分)

没有简单、高效、可扩展的方法来实现这一点。您应该只允许AddressSequence在PersonId之间递增。在大多数情况下,它在功能上是等价的。乙二醇

PersonID    AddressID       StreetAddress
----------- --------------- ---------------
1           1               123
1           2               456
2           3               789
2           4               789
带有PK(PersonID,AddressID)


出于显示目的,您始终可以使用表达式生成AddressSequence,如
row\u number()(按PersonID顺序按AddressID划分)

这里的
序列似乎不是正确的选择
ROW\u NUMBER
RANK
会更好。我建议在每次插入时只提供AddressSequence值。@Larnu我猜您的意思是在按需查询表时使用ROW\u NUMBER,而不是在插入时预填充表。这将需要一个单独的增量列来确保顺序保持一致,因此无论如何都需要一个序列或标识。我同意这似乎是一个更好的选择。在这里,
序列
似乎不是正确的选择
ROW\u NUMBER
RANK
会更好。我建议在每次插入时只提供AddressSequence值。@Larnu我猜您的意思是在按需查询表时使用ROW\u NUMBER,而不是在插入时预填充表。这将需要一个单独的增量列来确保顺序保持一致,因此无论如何都需要一个序列或标识。我同意这似乎是一个更好的选择。还有一个,因为这是事实上的正确答案。但我也经常希望有这样一个“分区序列”特性,尽管我知道它并不存在,但这并不是所有事情的功能都是等价的。例如,如果随着时间的推移,您有超过20亿个序列,或者如果您需要在以前的系统中模拟使用代码而不是DB功能来实现这一点的行为。您可以滚动序列,只要没有一列key@JoelCoehoorn“分割序列”-谢谢,我绞尽脑汁想找出正确的术语,但结果却是一片空白。@DavidBrowne Microsoft谢谢-这很有意义。@JoeEnos没有正确的术语,因为这(不幸的是,在我看来)不是DBs做的事情。另外一个,因为这是正确的答案。但我也经常希望有这样一个“分区序列”特性,尽管我知道它并不存在,但这并不是所有事情的功能都是等价的。例如,如果随着时间的推移,您有超过20亿个序列,或者如果您需要在以前的系统中模拟使用代码而不是DB功能来实现这一点的行为。您可以滚动序列,只要没有一列key@JoelCoehoorn“分割序列”-谢谢,我绞尽脑汁想找出正确的术语,结果却一无所获。@DavidBrowne Microsoft谢谢你-这很有意义。@JoeEnos没有正确的术语,因为(不幸的是,在我看来)DBs不会这么做。