sql-server - 复合增量列

标签 sql-server tsql sql-server-2012 sql-server-2008-r2 database-schema

我遇到一种情况,假设另一个列的值相同,则需要将辅助列增加 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
)

首先,我的 UID 是完全唯一的,无论 App_ID 是什么。

在我的情况下,我希望 idIncrement(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

正在考虑将增量逻辑放入 Insert 存储过程中,但想看看是否有更简单或不同的方式在没有存储过程的情况下产生相同的结果。

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

更新#1

让我们重新思考一下。

这是关于在 App_ID 上存在一个 PK UID 和最终的分区列 id,每个新的值都会增加 1关联的 App_id 条目。

  • 这与 Row_Number() 的做法类似,但无需每次插入新条目时重新计算值的所有开销。
  • 此外,App_IDid 都有成为 BIGINT 的空间和潜力;因此可能组合的组合数为:BIGINT x BIGINT

最佳答案

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

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

MAX(identity)

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

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

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

关于sql-server - 复合增量列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36003573/

相关文章:

sql - 基于两列创建数字规则

sql - 如何将列转换为行并替换列名

mysql - 将动态语句从 SQL-Server 转换为 Mysql

mysql - SQL显示总销售额

SQL ERD-主键出现两次

c# - C#中存储过程的返回值返回错误

sql - 比较 SQL 中长度不等的字符串

tsql - T-SQL-连接多个表导致重复的行

sql - 查询结果为单行或多值,以逗号分隔

reporting-services - 如何在ssrs中添加oracle数据源