Ich stimme Sean zu - fügen Sie eine Identitätsspalte hinzu und verwenden Sie dann einfach eine berechnete Spalte für die Aufgaben-ID. Obwohl ich hier eine Frage sehr ähnlich beantwortet habe, bin ich mir nicht sicher, ob ich diese als Duplikat markieren soll. Der Grund dafür ist, dass Sie die task_id
verwenden möchten als Teil des Primärschlüssels.
Ich bin mir jedoch nicht sicher, ob das möglich ist, da eine berechnete Spalte, um sie in den Primärschlüssel aufzunehmen, persisted
sein muss , und aus irgendeinem Grund (ich denke, es liegt an der Verwendung einer UDF) erlaubt mir SQL Server nicht, sie als dauerhaft zu markieren.
Wie auch immer, hier ist mein Lösungsvorschlag dafür:
Erstellen Sie zuerst eine Funktion, die die Aufgaben-ID berechnet:
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
Erstellen Sie dann die Tabelle mit der Aufgaben-ID als berechnete Spalte:
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
Jetzt testen:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
Ergebnisse:
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
Sie können eine Live-Demo auf rextester sehen.