Съгласен съм с Шон – добавете колона за самоличност и след това просто използвайте изчислена колона за идентификатора на задачата. Въпреки че отговорих на въпрос, много подобен на този тук, не съм сигурен дали да маркирате този като дубликат. Причината за това е, че искате да използвате task_id
като част от първичния ключ.
Не съм сигурен обаче, че това е възможно, тъй като за да се включи изчислена колона в първичния ключ, тя трябва да бъде persisted
, и по някаква причина (мисля, че е заради използването на UDF) SQL Server няма да ми позволи да го маркирам като постоянен.
Както и да е, ето предложеното от мен решение за това:
Първо, създайте функция, която ще изчисли идентификатора на задачата:
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
След това създайте таблицата с идентификатора на задачата като изчислена колона:
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
Можете да видите демонстрация на живо на rextester.