【问题标题】:Can you specify a sub-sequence for a table?你可以为一个表指定一个子序列吗?
【发布时间】:2015-02-24 18:04:52
【问题描述】:

我已经创建了一个项目历史记录表,我想自动递增由ItemId 分区的VersionId

ID ItemId VersionId ItemContent Created
1 1 1 富 2015-02-24 12:54:00.11
2 2 1 巴尔 2015-02-24 12:54:15.35
3 1 2 富 2015-02-24 12:55:00.61
4 1 3 巴兹 2015-02-24 12:55:45.23
5 2 2 酒吧 2015-02-24 12:56:00.03

目前,VersionId 设置在触发器中。我想找到的是这样的(我知道这实际上不起作用):

create table ItemHistory
(
     Id int identity(1,1) not null primary key
    ,ItemId int not null references Item(Id)
    ,VersionId int not null default row_number() over (partition by ItemId order by Id)
    ,ItemContent varchar(max)
    ,Created datetime not null default getdate()
)

虽然我有一个可行的解决方案,但我想知道我是否缺少一些用于处理这种情况的内置功能。

【问题讨论】:

  • 那么您是说当您在表中写入一行时,您将指定 ItemId,并且您希望根据表中已有的行自动设置 VersionId?
  • @Elliveny 是的,没错。
  • 我认为触发器就是这里的答案。我不知道更好的解决方案。对这个问题投赞成票,我很想看看是否有人提出任何建议!
  • 为什么不直接用视图来做呢?您可以在视图中使用 row_number()。
  • @blam 是的。这可能是比使用触发器更好的选择。

标签: sql-server tsql sql-server-2012


【解决方案1】:

如果你想用我的评论作为答案

为什么不只是用视图来做呢?您可以在视图中有 row_number() 。

在 ItemId 上有索引,Id 应该很快。
可能比触发器更少的开销。

我看到您添加了只读评论。更值得一看的理由。

【讨论】:

  • 虽然肯定比触发器好,但我想我希望有一些新奇的热度,即:将分区序列作为默认约束。
  • 一个 FK 标识,每个 FK 的序列都是甜蜜的。
  • 我同意.. 可能需要新奇的热度。分区序列听起来很棒。
猜你喜欢
  • 2013-01-09
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
  • 2010-12-28
  • 1970-01-01
  • 1970-01-01
  • 2010-09-22
  • 2016-12-21
相关资源
最近更新 更多