Jag håller med Sean - lägg till en identitetskolumn och använd sedan bara en beräknad kolumn för uppgifts-id. Även om jag har svarat på en fråga som liknar den här här, är jag inte säker på att markera denna som en dubblett. Anledningen till detta är att du vill använda task_id
som en del av primärnyckeln.
Jag är dock inte säker på att det är möjligt, eftersom den måste vara persisted
för att kunna inkludera en beräknad kolumn i primärnyckeln. , och av någon anledning (jag tror att det är på grund av användningen av en UDF) tillåter inte SQL Server mig att markera det som beständigt.
Här är i alla fall mitt förslag till lösning för detta:
Skapa först en funktion som beräknar uppgifts-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
Skapa sedan tabellen med uppgifts-id som en beräknad kolumn:
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
Testa det nu:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
Resultat:
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
Du kan se en livedemo på rextester.