在我的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
可能的解决方案,但是,由于我希望此列成为表格的复合主键的一部分,我认为这不会起作用。
提前全部谢谢。
答案 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