Souhlasím se Seanem – přidejte sloupec identity a pak použijte vypočítaný sloupec pro id úkolu. I když jsem zde odpověděl na otázku velmi podobnou této, nejsem si jistý, zda ji označit jako duplikát. Důvodem je, že chcete použít task_id
jako součást primárního klíče.
Nejsem si však jistý, že je to možné, protože pro zahrnutí vypočítaného sloupce do primárního klíče musí být persisted
a z nějakého důvodu (myslím, že je to kvůli použití UDF) mi SQL Server nedovolí označit to jako trvalé.
Každopádně zde je mé navrhované řešení:
Nejprve vytvořte funkci, která bude vypočítat ID úlohy:
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
Poté vytvořte tabulku s ID úlohy jako vypočítaný sloupec:
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
Nyní to otestujte:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
Výsledky:
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
Živé demo můžete vidět na rextesteru.