复合增量列

Gol*_*hop 6 t-sql sql-server sql-server-2008-r2 database-schema sql-server-2012

我有一种情况,我需要将辅助列递增1,假设另一列的值相同.

表模式:

CREATE TABLE [APP].[World]
(
    [UID] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
    [App_ID] [bigint] NOT NULL,
    [id] [bigint] NOT NULL,
    [name] [varchar](255) NOT NULL,
    [descript] [varchar](max) NULL,
    [default_tile] [uniqueidentifier] NOT NULL,
    [active] [bit] NOT NULL,
    [inactive_date] [datetime] NULL
)
Run Code Online (Sandbox Code Playgroud)

首先,UID无论是什么,我都是独一无二的App_ID.

在我的情况下,我希望id与之相似Increment(1,1),只是为了相同App_ID.

假设:

  1. 有3 App_Id:1,2,3

场景:

  • App_ID 1有3个世界
  • App_ID 2有5个世界
  • App_ID 3有1个世界

理想的结果:

App_ID  id
1       1
2       1
3       1
1       2
2       2
1       3
2       3
2       4
2       5
Run Code Online (Sandbox Code Playgroud)

正在考虑将增量逻辑放在Insert存储过程中,但是想要查看在没有存储过程的情况下是否会有更简单或不同的方法来生成相同的结果.

图可用选项是触发器或存储过程实现,但是想确保没有一些我遗漏的边缘情况模式.

更新#1

让我们重新思考一下.

这是关于存在PK UID并且最终是分区列id,App_ID对于关联的每个新条目增加1 App_id.

  • 这与您的操作类似,Row_Number()但每次插入新条目时都没有重新计算值的所有开销.
  • 同样App_ID,id两者都有存在的空间和潜力BIGINT; 因此,可能组合的组合数量为:BIGINT x BIGINT

sim*_*mme 1

这是不可能按照您要求的方式实施的。正如其他人在对您的原始帖子的评论中指出的那样,您的数据库设计最好分为多个表,这些表都有自己的身份,并在必要时利用外键约束。

但是,如果您坚决要继续采用这种方法,我会将 app_id 设为身份列,然后通过首先查询它来增加 id 列

MAX(identity)
Run Code Online (Sandbox Code Playgroud)

然后将响应增加 1。这种逻辑适合在存储过程中实现,无论如何您都应该为插入实现该逻辑,以防止直接 sql 注入等。该过程的查询部分可能如下所示:

INSERT INTO
  [db].dbo.[yourtable]
SET
  (
    app_id
    , id
  ) 
VALUES
  (
   @app_id
   , (
        SELECT
          MAX(id)
        FROM
          [db].dbo.[table]
          WHERE
            App_id = @app_id
     )
   )
Run Code Online (Sandbox Code Playgroud)

然而,这样做对性能的影响取决于您的评估。此外,您还需要考虑当该 app_id 没有先前的行时如何正确处理。