类似于标识的列,但基于Group By标准

时间:2017-08-15 12:41:49

标签: sql sql-server primary-key identity

在我的SQL Server 2012数据库中,我正在创建一个“任务”表,其中包含一个由三个字段组成的复合主键:

.gameDiv

Issue_ID [int] NOT NULL, Issue_Sub_ID [int] NOT NULL, Task_ID [int] NOT NULL Issue_ID是其他表的外键。在我正在创建的表格中,每个Issue_Sub_ID / Issue_ID组合可能会有许多相关的任务。

我想要做的是为Issue_Sub_ID列建立一个默认值,类似于我使用Task_ID,但会根据IDENTITY(1,1) / {自动增加{1}}组。例如,根据提供的Issue_ID / Issue_Sub_ID值,Task_ID结果如下所示:

Issue_ID

我熟悉Issue_Sub_ID可能的解决方案,但是,由于我希望此列成为表格的复合主键的一部分,我认为这不会起作用。

提前全部谢谢。

1 个答案:

答案 0 :(得分:4)

我同意肖恩 - 添加一个标识列,然后只使用计算列作为任务标识。 即使我回答了一个非常类似here的问题, 我不确定是否将此标记为副本。原因是您希望将task_id用作主键的一部分 但是,我不确定是否可行,因为为了在主键中包含计算列,它必须是persisted,并且出于某种原因(我认为这是因为使用了UDF)SQL Server将不允许我将其标记为持久。
无论如何,这是我提出的解决方案:

首先,创建一个计算任务ID的函数:

CREATE FUNCTION dbo.GenerateTaskId
(
    @Row_Id int,
    @Issue_Id int,
    @Issue_Sub_Id int
)
RETURNS Int
AS
BEGIN

    RETURN 
    (
        SELECT COUNT(*)
        FROM dbo.Tasks
        WHERE Issue_Id = @Issue_Id
        AND Issue_Sub_ID = @Issue_Sub_ID
        AND Row_Id <= @Row_Id
    )
END
GO 

然后,使用任务ID作为计算列创建表:

CREATE TABLE dbo.Tasks
(
    Row_Id [int] IDENTITY(1,1),
    Issue_ID [int] NOT NULL,
    Issue_Sub_ID [int] NOT NULL,
    Task_Id AS dbo.GenerateTaskId(Row_Id, Issue_Id, Issue_Sub_Id), 
    CONSTRAINT PK_Tasks PRIMARY KEY (Row_Id)
)
GO

现在,测试一下:

INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)

SELECT *
FROM Tasks

结果:

Row_Id  Issue_ID    Issue_Sub_ID    Task_Id
1       12345       1               1
2       12345       1               2
3       12345       1               3
4       12345       2               1
5       12345       2               2
6       67890       2               1
7       67890       2               2
8       67890       2               3

You can see a live demo on rextester.