我遇到一种情况,假设另一个列的值相同,则需要将辅助列增加 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
是什么。
在我的情况下,我希望 id
与 Increment(1,1)
类似,仅适用于相同的 App_ID
。
假设:
- 有 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_ID
和id
都有成为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/